百度地图sdk导航

百度地图sdk导航


文章目录

  • 百度地图sdk导航
  • 前言
  • 一、准备
  • 二、下载demo
  • 三、配置
    • 将上面libs的复制到下面的目录(我有x86和x86_64因为之前同事写了地图插件🐓)
    • 导入这两个aar
      • 导入过程
    • 1.配置build.gradle(两个不同的)
    • 2.打开apk试玩
    • 看源码找到需要的demo界面(我:专业导航)(已改好)
    • 控制界面调用(只复制了方法)
      • 创建(复制)xml界面
      • 配置android界面
    • 获取TTS服务 appid等
      • 打开网址
      • 进入控制台
      • 点击语音技术
      • 创建应用
      • 应用名称、应用描述随便填,包名填上面gradle中的 applicationId
      • 创建完毕后如下,复制后填入即可
      • 效果
  • 总结


前言

公司要用到百度地图sdk的专业导航,让写个flutter插件。。。。
我负责android原生导航😁
在此记录


提示:以下是本篇文章正文内容,下面案例可供参考

一、准备

官方文档

https://lbsyun.baidu.com/index.php?title=android-navsdk/guide/projectConfiguration

根据文档配置权限,配置ak

二、下载demo

点击相关下载
在这里插入图片描述
把下面这两个都下载下来
在这里插入图片描述
解压
在这里插入图片描述

三、配置

在这里插入图片描述

将上面libs的复制到下面的目录(我有x86和x86_64因为之前同事写了地图插件🐓)

在这里插入图片描述

导入这两个aar

在这里插入图片描述

导入过程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后finish

1.配置build.gradle(两个不同的)

代码如下(示例):

android {compileSdkVersion 29defaultConfig {minSdkVersion 16}lintOptions {disable 'InvalidPackage'}sourceSets {main {//我加入的-------jniLibs.srcDir 'libs'//------------}}
}dependencies {implementation files('libs/BaiduLBS_Android.jar')implementation files('libs/okio-1.13.0.jar')implementation files('libs/okhttp-3.8.1.jar')implementation files('libs/bos-android-sdk-1.0.3.jar')implementation files('libs/BaiduTraceSDK_v3_1_7.jar')implementation files('libs/intellij_annotations.jar')implementation files('libs/javapoet-1.9.0.jar')implementation files('libs/protobuf-java-2.3.0-micro.jar')implementation files('libs/protobuf_gens-map.jar')implementation project(':onsdk_all')//我加入的-------implementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support:cardview-v7:28.0.0'implementation 'com.android.support:recyclerview-v7:28.0.0'implementation 'com.android.support.constraint:constraint-layout:1.1.3'//----------implementation project(':NaviTts')
}
android {compileSdkVersion 29lintOptions {disable 'InvalidPackage'}defaultConfig {// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).applicationId "com.dyys.baidumap.plugin.flutter_baidumap_plugin_example"minSdkVersion 18targetSdkVersion 29versionCode flutterVersionCode.toInteger()versionName flutterVersionName//我加入的----------------// 避免"64K 引用限制"multiDexEnabled true// 导航SDK内部使用了annotationProcessor,需要添加下面代码,防止编译异常javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true }}//-----------------------------}buildTypes {release {// TODO: Add your own signing config for the release build.// Signing with the debug keys for now, so `flutter run --release` works.signingConfig signingConfigs.debug}}

2.打开apk试玩

在这里插入图片描述

看源码找到需要的demo界面(我:专业导航)(已改好)

DemoGuideActivity.java

/** Copyright (C) 2018 Baidu, Inc. All Rights Reserved.*/
package com.dyys.baidumap.plugin.flutter_baidumap_plugin.activity;import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;import com.baidu.navisdk.adapter.BNaviCommonParams;
import com.baidu.navisdk.adapter.BaiduNaviManagerFactory;
import com.baidu.navisdk.adapter.IBNRouteGuideManager;
import com.baidu.navisdk.adapter.IBNTTSManager;
import com.baidu.navisdk.adapter.IBNaviListener;
import com.baidu.navisdk.adapter.IBNaviViewListener;
import com.baidu.navisdk.adapter.struct.BNGuideConfig;
import com.baidu.navisdk.adapter.struct.BNHighwayInfo;
import com.baidu.navisdk.adapter.struct.BNRoadCondition;
import com.baidu.navisdk.adapter.struct.BNaviInfo;
import com.baidu.navisdk.adapter.struct.BNaviLocation;
import com.baidu.navisdk.ui.routeguide.model.RGLineItem;import java.util.List;/*** 诱导界面*/
public class DemoGuideActivity extends Activity {private static final String TAG = "flutter_baidumap_plugin";private IBNRouteGuideManager mRouteGuideManager;private IBNaviListener.DayNightMode mMode = IBNaviListener.DayNightMode.DAY;View view;GuidePop guidePop;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);boolean fullScreen = supportFullScreen();Bundle params = new Bundle();params.putBoolean(BNaviCommonParams.ProGuideKey.IS_SUPPORT_FULL_SCREEN, fullScreen);mRouteGuideManager = BaiduNaviManagerFactory.getRouteGuideManager();BNGuideConfig config = new BNGuideConfig.Builder().params(params).build();view = mRouteGuideManager.onCreate(this, config);if (view != null) {setContentView(view);}guidePop = new GuidePop(this);initTTSListener();routeGuideEvent();}// 导航过程事件监听private void routeGuideEvent() {BaiduNaviManagerFactory.getRouteGuideManager().setNaviListener(new IBNaviListener() {@Overridepublic void onRoadNameUpdate(String name) { // 弹窗展示
//                ControlBoardWindow.getInstance().showControl("当前路名更新——" + name);guidePop.setdata(name);}@Overridepublic void onRemainInfoUpdate(int remainDistance, int remainTime) { // 弹窗展示
//                ControlBoardWindow.getInstance()
//                        .showControl("距离目的地的剩余——" + remainDistance + "m " + remainTime + "s");guidePop.setdata(remainDistance, remainTime);}@Overridepublic void onViaListRemainInfoUpdate(Message msg) {}@Overridepublic void onGuideInfoUpdate(BNaviInfo naviInfo) { // 弹窗展示
//                ControlBoardWindow.getInstance().showControl("诱导信息——" + naviInfo.toString());guidePop.setdata(naviInfo);}@Overridepublic void onHighWayInfoUpdate(Action action, BNHighwayInfo info) {
//                ControlBoardWindow.getInstance()
//                        .showControl("高速信息——" + action + " " + info.toString());}@Overridepublic void onFastExitWayInfoUpdate(Action action, String name, int dist, String id) {
//                ControlBoardWindow.getInstance()
//                        .showControl("快速路出口信息——" + action + " " + name + " 出口还有" + dist + "米");}@Overridepublic void onEnlargeMapUpdate(Action action, View enlargeMap, String remainDistance,int progress, String roadName, Bitmap turnIcon) {
//                ControlBoardWindow.getInstance().showControl("放大图回调信息——不想写了自己看吧_gb");}@Overridepublic void onDayNightChanged(DayNightMode style) {
//                ControlBoardWindow.getInstance().showControl("日夜更替信息回调" + style);}@Overridepublic void onRoadConditionInfoUpdate(double progress, List<BNRoadCondition> items) {
//                ControlBoardWindow.getInstance().showControl("路况信息更新 进度:" + progress + " 路况:。。。");}@Overridepublic void onMainSideBridgeUpdate(int type) {
//                ControlBoardWindow.getInstance().showControl("主辅路、高架桥信息更新:" + type + " 意义不明??—gb");}@Overridepublic void onLaneInfoUpdate(Action action, List<RGLineItem> laneItems) {
//                if (laneItems != null && laneItems.size() > 0) {
//                    ControlBoardWindow.getInstance().showControl("车道线信息更新:" +
//                            action + laneItems.get(0).toString() + " ...");
//                }}@Overridepublic void onSpeedUpdate(String speed, boolean isOverSpeed) {
//                ControlBoardWindow.getInstance()
//                        .showControl("当前车速:" + speed + " 是否超速:" + isOverSpeed);}@Overridepublic void onArriveDestination() {
//                BNaviResultInfo info =
//                        BaiduNaviManagerFactory.getRouteGuideManager().getNaviResultInfo();
//                Toast.makeText(DemoGuideActivity.this, "导航结算数据: " + info.toString(),
//                        Toast.LENGTH_SHORT).show();
//                ControlBoardWindow.getInstance().showControl("抵达目的地:" + info.toString());}@Overridepublic void onArrivedWayPoint(int index) {
//                ControlBoardWindow.getInstance().showControl("到达途径点——" + index);}@Overridepublic void onLocationChange(BNaviLocation naviLocation) {
//                ControlBoardWindow.getInstance().showControl("GPS位置有更新时的回调:");}@Overridepublic void onMapStateChange(MapStateMode mapStateMode) {//                if (mapStateMode == MapStateMode.BROWSE) {//                    Toast.makeText(DemoGuideActivity.this, "操作态", Toast//                    .LENGTH_SHORT).show();//                } else if (mapStateMode == MapStateMode.NAVING) {//                    Toast.makeText(DemoGuideActivity.this, "导航态", Toast//                    .LENGTH_SHORT).show();//                }
//                ControlBoardWindow.getInstance()
//                        .showControlOnlyone("底图操作态和导航态的回调: 别老摸就不会老回调了_为什么不自动变回导航态?_gb",
//                                "onMapStateChange");}@Overridepublic void onStartYawing(String s) {}@Overridepublic void onYawingSuccess() {
//                ControlBoardWindow.getInstance().showControl("偏航成功的回调");}@Overridepublic void onYawingArriveViaPoint(int i) {}@Overridepublic void onNotificationShow(String msg) {Log.e(TAG, msg);
//                ControlBoardWindow.getInstance().showControl("导航中通知型消息的回调" + msg);}@Override            public void onHeavyTraffic() {Log.e(TAG, "onHeavyTraffic");
//                ControlBoardWindow.getInstance().showControl("导航中前方一公里出现严重拥堵的回调");}@Overridepublic void onNaviGuideEnd() {DemoGuideActivity.this.finish();}});BaiduNaviManagerFactory.getRouteGuideManager().setNaviViewListener(new IBNaviViewListener() {@Overridepublic void onMainInfoPanCLick() {
//                        ControlBoardWindow.getInstance().showControl("诱导面板的点击");guidePop.showAtLocation(view,Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);}@Overridepublic void onNaviTurnClick() {
//                        ControlBoardWindow.getInstance().showControl("界面左上角转向操作的点击");}@Overridepublic void onFullViewButtonClick(boolean show) {
//                        ControlBoardWindow.getInstance().showControl("全览按钮的点击");}@Overridepublic void onFullViewWindowClick(boolean show) {
//                        ControlBoardWindow.getInstance().showControl("全览小窗口的点击");}@Overridepublic void onNaviBackClick() {Log.e(TAG, "onNaviBackClick");
//                        ControlBoardWindow.getInstance().showControl("导航页面左下角退出按钮点击");}@Overridepublic void onBottomBarClick(Action action) {
//                        ControlBoardWindow.getInstance().showControl("底部中间部分点击");}@Overridepublic void onNaviSettingClick() {Log.e(TAG, "onNaviSettingClick");
//                        ControlBoardWindow.getInstance().showControl("底部右边更多设置按钮点击");}@Overridepublic void onRefreshBtnClick() {
//                        ControlBoardWindow.getInstance().showControl("刷新按钮");}@Overridepublic void onZoomLevelChange(int level) {
//                        ControlBoardWindow.getInstance().showControl("地图缩放等级:" + level);}@Overridepublic void onMapClicked(double x, double y) {
//                        ControlBoardWindow.getInstance().showControlOnlyone("地图点击的回调(国测局GCJ02坐标):x="
//                                + x + " y=" + y, "onMapClicked");}@Overridepublic void onMapMoved() {Log.e(TAG, "onMapMoved");
//                        ControlBoardWindow.getInstance().showControl("移动地图的回调");}@Overridepublic void onFloatViewClicked() {
//                        ControlBoardWindow.getInstance().showControl("后台诱导悬浮窗的点击");
//                        try {
//                            Intent intent = new Intent();
//                            intent.setPackage(getPackageName());
//                            intent.setClass(DemoGuideActivity.this,
//                                    Class.forName(DemoGuideActivity.class.getName()));
//                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
//                                    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
//                            startActivity(intent);
//                        } catch (ClassNotFoundException e) {
//                            e.printStackTrace();
//                        }}});}private void initTTSListener() {// 注册同步内置tts状态回调BaiduNaviManagerFactory.getTTSManager().setOnTTSStateChangedListener(new IBNTTSManager.IOnTTSPlayStateChangedListener() {@Overridepublic void onPlayStart() {Log.e("BNSDKDemo", "ttsCallback.onPlayStart");
//                        ControlBoardWindow.getInstance().showControl("ttsCallback.onPlayStart");}@Overridepublic void onPlayEnd(String speechId) {Log.e("BNSDKDemo", "ttsCallback.onPlayEnd");
//                        ControlBoardWindow.getInstance().showControl("ttsCallback.onPlayEnd");}@Overridepublic void onPlayError(int code, String message) {Log.e("BNSDKDemo", "ttsCallback.onPlayError");
//                        ControlBoardWindow.getInstance().showControl("ttsCallback.onPlayError");}});// 注册内置tts 异步状态消息BaiduNaviManagerFactory.getTTSManager().setOnTTSStateChangedHandler(new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {Log.e("BNSDKDemo", "ttsHandler.msg.what=" + msg.what);
//                        ControlBoardWindow.getInstance()
//                                .showControl("ttsHandler.msg.what=" + msg.what);}});}private void unInitTTSListener() {BaiduNaviManagerFactory.getTTSManager().setOnTTSStateChangedListener(null);BaiduNaviManagerFactory.getTTSManager().setOnTTSStateChangedHandler(null);}@Overrideprotected void onStart() {super.onStart();
//        if (BNDemoUtils.getBoolean(this, "float_window")) {
//            mRouteGuideManager.onForeground();
//        }mRouteGuideManager.onStart();}@Overrideprotected void onResume() {super.onResume();getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);mRouteGuideManager.onResume();}protected void onPause() {super.onPause();mRouteGuideManager.onPause();getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);}@Overrideprotected void onStop() {super.onStop();mRouteGuideManager.onStop();
//        if (BNDemoUtils.getBoolean(this, "float_window")) {
//            mRouteGuideManager.onBackground();
//        }}@Overrideprotected void onDestroy() {super.onDestroy();mRouteGuideManager.onDestroy(false);unInitTTSListener();mRouteGuideManager = null;}@Overridepublic void onBackPressed() {mRouteGuideManager.onBackPressed(false, true);}public void onConfigurationChanged(android.content.res.Configuration newConfig) {super.onConfigurationChanged(newConfig);mRouteGuideManager.onConfigurationChanged(newConfig);}@Overridepublic void setRequestedOrientation(int requestedOrientation) {}@Overridepublic boolean onKeyDown(int keyCode, android.view.KeyEvent event) {if (!mRouteGuideManager.onKeyDown(keyCode, event)) {return super.onKeyDown(keyCode, event);}return true;}private boolean supportFullScreen() {if (Build.VERSION.SDK_INT >= 21) {Window window = getWindow();int color;if (Build.VERSION.SDK_INT >= 23) {color = Color.TRANSPARENT;} else {color = 0x2d000000;}window.setStatusBarColor(color);if (Build.VERSION.SDK_INT >= 23) {window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);int uiVisibility = window.getDecorView().getSystemUiVisibility();if (mMode == IBNaviListener.DayNightMode.DAY) {uiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;}window.getDecorView().setSystemUiVisibility(uiVisibility);} else {window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);}window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);return true;}return false;}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {mRouteGuideManager.onRequestPermissionsResult(requestCode, permissions, grantResults);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);mRouteGuideManager.onActivityResult(requestCode, resultCode, data);}
}

GuidePop.java

package com.dyys.baidumap.plugin.flutter_baidumap_plugin.activity;import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;import com.baidu.navisdk.adapter.struct.BNaviInfo;
import com.dyys.baidumap.plugin.flutter_baidumap_plugin.R;// 点击诱导面板 用于展示导航信息回调的pop
public class GuidePop extends PopupWindow {View mPopView;public GuidePop(Context context) {super(context);init(context);setpopwindow(context);}public void setdata(final BNaviInfo info) {mPopView.post(new Runnable() {@Overridepublic void run() {nextloadNameTv.setText("下个路口:" + info.getRoadName());nextloadDistanceTv.setText(info.getDistance() + "米 " + info.getTime() + "s后 ");turnIcon.setImageBitmap(info.getTurnIcon());}});}public void setdata(final String name) {mPopView.post(new Runnable() {@Overridepublic void run() {roadname.setText("当前:" + name);}});}public void setdata(final int remainDistance, final int remainTime) {mPopView.post(new Runnable() {@Overridepublic void run() {remainDistanceTv.setText("剩余 距离:" + remainDistance + "米 时间:" + remainTime + "s");}});}private void setpopwindow(final Context context) {this.setContentView(mPopView); // 设置Viewthis.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); // 设置弹出窗口的宽this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); // 设置弹出窗口的高this.setFocusable(true); // 设置弹出窗口可this.setBackgroundDrawable(new ColorDrawable(0x00000000)); // 设置背景透明this.setOutsideTouchable(true);this.setOnDismissListener(new OnDismissListener() { // 退出popupwidon时显示父控件原来的颜色@Overridepublic void onDismiss() {WindowManager.LayoutParams lp = ( (Activity) context).getWindow().getAttributes();lp.alpha = 1.0f;( (Activity) context).getWindow().setAttributes(lp);}});}TextView nextloadDistanceTv;TextView nextloadTimeTv;TextView nextloadNameTv;TextView remainDistanceTv;TextView remainTimeTv;TextView roadname;ImageView turnIcon;private void init(Context context) {LayoutInflater inflater = LayoutInflater.from(context);mPopView = inflater.inflate(R.layout.guidepopview, null);nextloadDistanceTv = mPopView.findViewById(R.id.nextload_distance);nextloadTimeTv = mPopView.findViewById(R.id.nextload_time);nextloadNameTv = mPopView.findViewById(R.id.nextload_name);remainDistanceTv = mPopView.findViewById(R.id.remainDistance);remainTimeTv = mPopView.findViewById(R.id.remainTime);turnIcon = mPopView.findViewById(R.id.turnIcon);roadname = mPopView.findViewById(R.id.roadname);}}

控制界面调用(只复制了方法)

//获取系统SD卡根目录路径String mSDCardPath = "";//应用在SD卡中的目录名(随便写)String APP_FOLDER_NAME = "flutter_baidumap_plugin";//起点纬度double startLat = 30.585814558410107;//起点经度double startLng = 104.055721746788;double endLat = 39.90882;double endLng = 116.39750;//起点名称String startName = "";//终点名称String endName = "";
/*** 开启导航** @param methodCall* @param result*/private void openNavigate(){mSDCardPath = getSdcardDir();//初始化initNavigate(mSDCardPath,APP_FOLDER_NAME);}private void initNavigate(String mSDCardPath,String APP_FOLDER_NAME){//初始化BaiduNaviManagerFactory.getBaiduNaviManager().init(context,mSDCardPath, APP_FOLDER_NAME, new IBaiduNaviManager.INaviInitListener() {String authinfo;@Overridepublic void onAuthResult(int status, String msg) {if (0 == status) {authinfo = "key校验成功!";} else {authinfo = "key校验失败, " + msg;}activity.runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(context, authinfo, Toast.LENGTH_LONG).show();}});}@Overridepublic void initStart() {Toast.makeText(context, "百度导航引擎初始化开始", Toast.LENGTH_SHORT).show();}@Overridepublic void initSuccess() {Toast.makeText(context, "百度导航引擎初始化成功", Toast.LENGTH_SHORT).show();beginNavigate();// 初始化ttsinitTTS();}@Overridepublic void initFailed(int errCode) {Toast.makeText(context, "百度导航引擎初始化失败", Toast.LENGTH_SHORT).show();}});}private void beginNavigate(){//路线规划并通知发起专业导航BNRoutePlanNode sNode = new BNRoutePlanNode.Builder().latitude(startLat).longitude(startLng).name(startName).description(startName).build();BNRoutePlanNode eNode = new BNRoutePlanNode.Builder().latitude(endLat).longitude(endLng).name(endName).description(endName).build();List<BNRoutePlanNode> list = new ArrayList<>();list.add(sNode);list.add(eNode);BaiduNaviManagerFactory.getRoutePlanManager().routePlanToNavi(list,IBNRoutePlanManager.RoutePlanPreference.ROUTE_PLAN_PREFERENCE_DEFAULT,null,new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_START:Toast.makeText(context.getApplicationContext(),"算路开始", Toast.LENGTH_SHORT).show();break;case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_SUCCESS:Toast.makeText(context.getApplicationContext(),"算路成功", Toast.LENGTH_SHORT).show();break;case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_FAILED:Toast.makeText(context.getApplicationContext(),"算路失败", Toast.LENGTH_SHORT).show();break;case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_TO_NAVI:Toast.makeText(context.getApplicationContext(),"算路成功准备进入导航", Toast.LENGTH_SHORT).show();Intent intent = new Intent(activity,DemoGuideActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);activity.startActivity(intent);break;default:// nothingbreak;}}});}private void initTTS() {// 使用内置TTSBNTTsInitConfig config = new BNTTsInitConfig.Builder().context(getApplicationContext()).sdcardRootPath(mSDCardPath).appFolderName(APP_FOLDER_NAME).appId("2391...略").appKey("GNGGY8cqqaeMfxt0...略").secretKey("ChpYiwd3H...略").build();BaiduNaviManagerFactory.getTTSManager().initTTS(config);}

创建(复制)xml界面

在这里插入图片描述
guidepopview.xml(activity_main.xml是地图用到的)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:background="#000000"android:orientation="vertical"android:gravity="center_horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/roadname"android:textSize="24dp"android:textColor="#ffffff"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageViewandroid:id="@+id/turnIcon"android:layout_width="wrap_content"android:layout_height="50dp"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/nextload_distance"android:textSize="24dp"android:textColor="#ffffff"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/nextload_time"android:textSize="24dp"android:textColor="#ffffff"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout><TextViewandroid:id="@+id/nextload_name"android:textColor="#ffffff"android:textSize="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><LinearLayoutandroid:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:textColor="#ffffff"android:textSize="20dp"android:id="@+id/remainDistance"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:textColor="#ffffff"android:textSize="20dp"android:id="@+id/remainTime"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout></LinearLayout>

配置android界面

在这里插入图片描述

直截取了application

 <application><!--  一定要有这个 uses-library  不然点退出导航app闪退--><uses-library android:name="org.apache.http.legacy" android:required="false" /><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service><serviceandroid:name="com.baidu.trace.LBSTraceService"android:enabled="true"android:process=":remote"></service><activityandroid:name=".page.BaseMap"android:configChanges="orientation|keyboardHidden|screenSize"android:label="@string/demo_title_createmaplist"android:screenOrientation="portrait" /><!--   配这两个就行了 --><activityandroid:name=".activity.DemoGuideActivity"android:configChanges="orientation|keyboardHidden|screenSize"android:screenOrientation="portrait"android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /><activityandroid:name=".activity.GuidePop"android:configChanges="orientation|keyboardHidden|screenSize"android:screenOrientation="portrait" /></application>

获取TTS服务 appid等

打开网址

https://ai.baidu.com/

进入控制台

在这里插入图片描述

点击语音技术

在这里插入图片描述

创建应用

在这里插入图片描述

应用名称、应用描述随便填,包名填上面gradle中的 applicationId

在这里插入图片描述

创建完毕后如下,复制后填入即可

在这里插入图片描述

效果

使用模拟机会闪退,因为没有模拟机对应的资源(我的模拟机是X86的)😭
在这里插入图片描述


总结

懵逼的时候先看demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53771.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言程序设计高速公路超速处罚,高速超速违章处理流程

1 如图所示&#xff0c;驾驶机动车看到这种手势信号时&#xff0c;应当停车等待。查看本题分析 2 如图所示&#xff0c;驾驶机动车在路口遇到这种交通信号时&#xff0c;右转弯的车辆在不妨碍被放行的车辆、行人的情况下&#xff0c;可以通行。查看本题分析 3 机动车驾驶证损毁…

什么是跨站脚本 (XSS) 攻击?

目录 定义跨站点脚本的工作原理 进行攻击以感染网站受感染的网站攻击用户统计和分析跨站点脚本攻击的类型反射式&#xff08;非持久性&#xff09;XSS反射式&#xff08;非持久性&#xff09;XSS 示例 存储&#xff08;持久&#xff09;XSS存储&#xff08;持久&#xff09;XSS…

周遭心理学的应用-什么是心理学?

前言 这篇文章的标题如果去掉好处二字就显得并不吸引人&#xff0c;难道好处二字对我们的判断影响那么大吗&#xff1f;这又是为什么&#xff1f;&#xff08;在引起共鸣的因素章节中&#xff0c;将会得到你要的答案&#xff09; 每一篇文章&#xff0c;每一本书只要涉及到生活…

超速判断java_超速如何判定

例如高速限速80码&#xff0c;行车时速92码&#xff0c;(92-80)除以80乘以100%等于15%&#xff0c;那就超速15% 。 第八十六条 机动车在道路上行驶&#xff0c;违反限速规定的&#xff0c;按下列规定处罚&#xff1a; 1、时速超过限定时速不到10%的&#xff0c;给予警告。 2、在…

怎样用c语言写高速超速罚款标准,超速罚款 超速扣分标准2020新交规怎么规定的...

高速驾驶确实可以带来速度的乐趣&#xff0c;但是这种行为违背了交通规则&#xff0c;而是超速行为。 那超速呢? 超速驾驶的惩罚是什么? 让我们来看看新的2020年超速处罚标准! 一、超速扣分标准新交规 机动车在道路上行驶&#xff0c;违反限速规定的&#xff0c;按下列最新超…

000210什么意思 error_检测卡上是0002什么意思啊

展开全部 【电脑主板故障诊断卡 代码】 代码 Award BIOS Ami BIOS Phoenix BIOS或Tandy 3000 BIOS 00 . 已显62616964757a686964616fe58685e5aeb931333264623139示系统的配置&#xff1b;即将控制INI19引导装入。 . 01 处理器测试1&#xff0c;处理器状态核实,如果测试失败&…

煤矿企业矿用重大设备感知数据接入方案

重大设备感知数据接入 建 设 方 案 1、项目建设背景 为贯彻落实全国关于安全生产工作的总体部署&#xff0c;依据《国家矿山安全监察局关于印发煤矿冲击地压、水害防治及重大设备感知数据接入细则&#xff08;试行&#xff09;的通知》&#xff08;矿安〔2021〕2号&#xff09…

Python案例3—计算基础代谢率V_4.0(已完结)

大家好&#xff0c;我是白菜胡萝丸子 人生苦短&#xff0c;Python当歌 项目导入 版本4.0&#xff1a;如果用户把信息输入错误了怎么办——处理异常操作 项目分析—理清思路 分析问题&#xff1a;分析问题的计算部分明确问题&#xff1a;划分问题的输入、处理和输出部分&…

代谢组检测

代谢组学是继基因组学和蛋白质组学之后新近发展起来的一门学科&#xff0c;是系统生物学的重要组成部分。基因组学和蛋白质组学分别从基因层面和蛋白质层面探寻生命的活动&#xff0c;而实际上细胞内许多生命活动是与代谢物相关的&#xff0c;如细胞信号、能量传递等都是受代谢…

[基因遗传算法]进阶之三:sko.GA的实践TSP

参考资料:《VRP问题分类》 相关文章: 《[基因遗传算法]原理思想和python代码的结合理解之(一) :单变量》 《[基因遗传算法]进阶之二:最优规划问题–多种编码方式多变量》 文章目录 一. GA的用法1.1 help(sko.GA)1.2 目标函数的书写A. 单变量的书写B. 多变量的书写C. 变量的范围…

chatgpt赋能python:Python计算BMI——如何快速方便地计算身体质量指数

Python计算BMI —— 如何快速方便地计算身体质量指数 身体质量指数&#xff08;BMI&#xff09;是一种常用的计算方法&#xff0c;用于衡量人体体重和身高的比例。这个算法在健康行业中非常受欢迎&#xff0c;因为它简单而且可以快速得出结果。在Python中&#xff0c;我们可以…

干货第一弹!多组学联合分析之代谢组FAQ

代谢组是对生物体内代谢产物全谱分析的一种研究手段&#xff0c;代谢产物包括核酸、蛋白质、脂类生物大分子以及其他小分子物质&#xff0c;目前主要是检测1000Da以下的物质。代谢组研究具有高通量的检测能力、高灵敏度和准确度、非侵入性、非破坏性、全面性、数据资源整合等特…

组学数据上传(五):代谢组学数据

继扩增子、转录组、蛋白组、基因组数据上传教程发布后&#xff0c;组学数据上传教程最后一弹--代谢组数据上传教程来罗&#xff0c;有需要的一定要点赞加收藏&#xff01;后续上传数据遇到问题可以私聊小编&#xff01;接下来我们来了解下代谢组学常用数据库MetaboLights以及如…

Python案例3—计算基础代谢率V_2.0

大家好&#xff0c;我是白菜胡萝丸子 人生苦短&#xff0c;Python当歌 项目导入 版本2.0:在版本1.0的基础上改造程序&#xff0c;根据用户的输入计算BMR&#xff0c;将BMR计算封装到函数并实现持续运行&#xff0c;让用户选择退出 项目分析—理清思路 分析问题&#xff1a;分…

Python案例3—计算基础代谢率V_3.0

大家好&#xff0c;我是白菜胡萝丸子 人生苦短&#xff0c;Python当歌 项目导入 版本3.0&#xff1a;在版本2.0的基础上改造程序&#xff0c;BMR值的输出要带单位&#xff0c;用户能否将数值在一行输入 项目分析—理清思路 分析问题&#xff1a;分析问题的计算部分明确问题&…

Python案例3—计算基础代谢率V_1.0

大家好&#xff0c;我是白菜胡萝丸子 人生苦短&#xff0c;Python当歌 项目导入 基础代谢率( Basal Metabolic Rate , BMR )是指人体在清醒而又极端安静的状态下,不受肌肉活动、环境温度、食物及精神紧张等影响时的能量代谢率。即基本的生理活动(即血液循环、呼吸及恒定的体温…

计算消耗卡路里C语言程序,人体基础代谢率计算公式,热量表,运动消耗热量值...

原标题&#xff1a;人体基础代谢率计算公式&#xff0c;热量表&#xff0c;运动消耗热量值 基础代谢率大概的计算公式&#xff1a; 女性&#xff1a;655 (9.6 x 体重) (1.7 x 身高) - (4.7X年龄) (体重kg 身高cm) 男性&#xff1a;66 (13.7 x 体重) (5.0 x 身高) - (6.8x年…

C语言底层逻辑剖析函数篇(其三),函数递归与迭代超详解,斐波那契数列递归经典例题,汉诺塔问题,青蛙跳台阶

这里写目录标题 C语言底层逻辑剖析函数篇&#xff08;其三&#xff09;&#xff0c;函数递归与迭代超详解&#xff0c;递归经典例题斐波那契数列&#xff0c;汉诺塔问题&#xff0c;青蛙跳台阶开篇语函数递归递归的两个必要条件递归案例1递归案例2递归和迭代递归经典例题——斐…

深入理解函数递归(汉诺塔问题详解)

汉诺塔问题 汉诺塔问题描述算法步骤三阶汉诺塔为例 函数递归什么是递归递归的两个必要条件 解决方法代码演示 汉诺塔问题描述 有一种被称为汉诺塔(Hanoi)的游戏&#xff0c;该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺…

浅谈汉诺塔问题,以及对其递归的分析

标题 浅谈汉诺塔问题&#xff0c;以及对其递归的分析 首先谈谈汉诺塔这个问题&#xff0c;这个问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒&#xff0c;第一根上面套着64个圆的金片&#xff0c;最大的一个在底下&#xff0c;其余一个比一个…