Kotlin - 百度导航Demo,我们一起来踩坑!

背景

项目开发中,我们总是离不开定位、地图这些功能,当然有时候有了地图,那么导航就显得很有必要了。现在让我们开启百度导航吧!

第一步:磨刀不误砍柴工,获得你需要的SDK包

下载地址:百度LBS导航SDK

首先我们得从官网采集我们需要的百度LBS开发包,此处就暂时省略啦!

*注意:要使用百度TTS语音,我们需要注册百度导航TTS白名单,否则我们的导航器可是不会吭声的哦!(当然,你自己集成了其他TTS库除外)

第二步:不积洼步,不足以至千里。学习他人经验,事半功倍

配置说明:百度LBS配置

SDK均已按照官方配置好了,现在我们需要做得就是看别人怎么写的 -- 查看官方导航DEMO源代码。

从官方Demo中可以看出,导航流程大致如下:

初始化SDK ---> 初始化导航配置参数 ---> 规划导航路线 -->开始导航

因此我们可以把官方导航Demo修改一下,直接拿来用!

下面是我总结的一个工具类,仅供参考:

class BaiduMapNavigator private constructor(val activity: Activity) {

companion object {

@JvmField

val ROUTE_PLAN_NODE = "routePlanNode"

@JvmField

var isBaiduNaviInitSuccess: Boolean = false

@SuppressLint("StaticFieldLeak")

@JvmField

var baiduNavi: BaiduMapNavigator? = null

@JvmStatic

fun getInstance(context: Activity): BaiduMapNavigator? {

if (baiduNavi == null) {

synchronized(BaiduMapNavigator::class.java) {

baiduNavi = BaiduMapNavigator(context)

}

}

return baiduNavi

}

}

private val eventListerner: BaiduNaviManager.NavEventListener

= BaiduNaviManager.NavEventListener { what, arg1, arg2, bundle -> BNEventHandler.getInstance().handleNaviEvent(what, arg1, arg2, bundle) }

/** 初始化导航 **/

fun initNavigator(context: Context, startNaviName: String, endNaviName: String, naviLatLng: Array) {

val loadingDialog: MaterialProgressDialog? = DialogUtil.initAndShow(context, MaterialProgressDialog::class.java)

loadingDialog?.setLoadingText("正在初始化...")

if (!isBaiduNaviInitSuccess) {

var authinfo: String?

val mSDCardPath = SysData.MAIN_APP_DIRECTORY

File(mSDCardPath, "EdumapNavi").mkdirs()

BaiduNaviManager.getInstance().init(activity, mSDCardPath, "EdumapNavi", object : BaiduNaviManager.NaviInitListener {

override fun onAuthResult(status: Int, msg: String) {

if (0 == status) {

authinfo = "key校验成功!"

} else {

authinfo = "key校验失败, " + msg

}

activity.runOnUiThread({ Toast.makeText(activity, authinfo, Toast.LENGTH_LONG).show() })

}

override fun initSuccess() {

Toast.makeText(activity, "百度导航引擎初始化成功", Toast.LENGTH_SHORT).show()

isBaiduNaviInitSuccess = true

//设置语音导航

val bundle = Bundle()

// 必须设置APPID,否则会静音

bundle.putString(BNCommonSettingParam.TTS_APP_ID, BuildConfig.BaiduMapApiKey)

BNaviSettingManager.setNaviSdkParam(bundle)

BNaviSettingManager.setShowTotalRoadConditionBar(BNaviSettingManager.PreViewRoadCondition.ROAD_CONDITION_BAR_SHOW_ON)

BNaviSettingManager.setVoiceMode(BNaviSettingManager.VoiceMode.Veteran)

// BNaviSettingManager.setPowerSaveMode(BNaviSettingManager.PowerSaveMode.DISABLE_MODE);

BNaviSettingManager.setRealRoadCondition(BNaviSettingManager.RealRoadCondition.NAVI_ITS_ON)

BNaviSettingManager.setIsAutoQuitWhenArrived(true)

//开始百度导航

routePlanToNavi(startNaviName, endNaviName, naviLatLng)

DialogUtil.hide(loadingDialog)

}

override fun initStart() {

Toast.makeText(activity, "百度导航引擎初始化开始", Toast.LENGTH_SHORT).show()

}

override fun initFailed() {

isBaiduNaviInitSuccess = false

DialogUtil.hide(loadingDialog)

Toast.makeText(activity, "百度导航引擎初始化失败", Toast.LENGTH_SHORT).show()

}

}, null, TTSCallbackHandler(activity), TTSPlayStatusCallback(activity))

} else {

routePlanToNavi(startNaviName, endNaviName, naviLatLng)

DialogUtil.hide(loadingDialog)

}

}

/**

* 路线规划函数

* @param startNaviName 导航起始地

* @param endNaviName 导航目的地

*/

private fun routePlanToNavi(startNaviName: String, endNaviName: String, naviLatLng: Array) {

val sNode: BNRoutePlanNode = BNRoutePlanNode(naviLatLng[0].longitude, naviLatLng[0].latitude, startNaviName, null, BNRoutePlanNode.CoordinateType.BD09LL)

val eNode: BNRoutePlanNode = BNRoutePlanNode(naviLatLng[1].longitude, naviLatLng[1].latitude, endNaviName, null, BNRoutePlanNode.CoordinateType.BD09LL)

BaiduNaviManager.getInstance().launchNavigator(activity, arrayListOf(sNode, eNode), 1, true, BaiduRoutePlanListener(sNode), eventListerner)

}

/**

* 路线导航监听

* @param node 规划路线节点

*/

inner class BaiduRoutePlanListener(node: BNRoutePlanNode) : BaiduNaviManager.RoutePlanListener {

private var mBNRoutePlanNode: BNRoutePlanNode? = null

init {

mBNRoutePlanNode = node

}

override fun onJumpToNavigator() {

val intent = Intent(activity, BNGuideActivity::class.java)

val bundle = Bundle()

bundle.putSerializable(ROUTE_PLAN_NODE, mBNRoutePlanNode)

intent.putExtras(bundle)

activity.startActivity(intent)

}

override fun onRoutePlanFailed() {

Toast.makeText(activity, "路线规划失败", Toast.LENGTH_SHORT).show()

}

}

/**

* 语音播报播放状态回调

* @param activity 上下文对象

*/

class TTSPlayStatusCallback(val activity: Activity) : BaiduNaviManager.TTSPlayStateListener {

override fun playStart() {

Log.i(BaiduMapNavigator::class.java.simpleName, "status: 开始播报导航...")

}

override fun playEnd() {

Log.i(BaiduMapNavigator::class.java.simpleName, "status: 播报导航结束...")

}

}

/**

* 语音播报回调

* @param context 上下文对象

*/

class TTSCallbackHandler(val context: Context) : Handler() {

override fun handleMessage(msg: Message) {

val type = msg.what

when (type) {

BaiduNaviManager.TTSPlayMsgType.PLAY_START_MSG -> {

Log.i(BaiduMapNavigator::class.java.simpleName, "开始播报导航...")

}// showToastMsg("Handler : TTS play start");

BaiduNaviManager.TTSPlayMsgType.PLAY_END_MSG -> {

Log.i(BaiduMapNavigator::class.java.simpleName, "播报导航结束...")

}// showToastMsg("Handler : TTS play end");

else -> {

}

}

}

}

}

万事俱备只欠东风,那么该怎么调用呢?

java:

BaiduMapNavigator.getInstance(Activity activity).initNavigator(Context context, String startNaviName, String endNaviName, LatLng[] naviLatLng);

kotlin:

BaiduMapNavigator.getInstance(activity: Activity).initNavigator(context: Context, startNaviName: String, endNaviName: String, naviLatLng: Array);

功成身退,成败得失

集成第三方SDK其实并不麻烦,麻烦的是第三方提供的文档有时候是有误的或者表述并不明了,亦或者已经过时。这就很需要我们去查看Demo,归纳出我们自己需要的代码精华。集成这次百度导航中,最让我困惑的是arm64-v8a架构的设备找不到libgnustl_shared.so的位置,armeabi-v7a表现正常!

android百度导航demo,Android - 百度导航Demo,我们一起来踩坑!相关推荐

  1. 在百度地图中叠加CAD图及GIS数据展示踩坑记

    前言 在之前的几篇博客中分别介绍了 在Cesium中实现与CAD的DWG图叠加显示分析 https://www.cnblogs.com/vjmap/p/16541751.html . 高德地图与CAD ...

  2. 高德逆地理编码接口返回数据格式不统一以及百度逆地理编码接口返回数据解析失败的踩坑记录

    最近有个需求是定位后根据定位的经纬度获取当前地址的详细信息,例如获取街道名称,街道号,乡镇街道编码,区域编码等信息. 于是乎找到了高德的逆地理编码接口,看了看正好符合我的需求.然而使用起来并不顺利! ...

  3. android微信h5转原生支付,微信原生支付流程以及踩坑

    本次记录的是微信"JSAPI"的支付方式  也就是微信内H5页面调起支付,其他支付方式也大同小异,总体的流程和思路大致是一样的,基本配置方面就不详细记录,只需要商户号和商户Key, ...

  4. Android 常用开发功能 博客导航

    转载地址:http://blog.csdn.net/ciqing123/article/details/52931663?locationNum=16&fps=1 简介:第一次在CSDN上发表 ...

  5. android 谷歌定位demo,android实现定位与目的地的导航示例代码

    今天无意中看到技术大神利用百度地图定位并实现目的地导航的Demo.觉得很不错,就转载过来一起分享,下面我们看实现效果: 进入后首先会得到当前位置,在地图上显示出来,在输入框中输入目的地后,就会在地图上 ...

  6. android百度地图集成,android 百度地图集成之 导航

    导航 关于这个导航也是困扰了我好长的一段时间的 现在终于整理出来了,来给大家分享一下 其实简单的 ,在百度的API把他的示例dome下载下来就好了 -然后我告诉你要用哪些. 百度的申请账户,申请KEY ...

  7. Android 不归路之百度地图API学习(导航篇)

    在学习百度地图api 导航篇时 不论怎么仿写官方DEMO 都不能初始化导航引擎 纠结了两天 在LBS论坛上找到同样问题 传送门初始化导航失败 文中解决方法 主要有三种: 目前demo中初始化导航失败有 ...

  8. Android 打开高德地图、百度地图进行导航;打开第三方App去导航;

    抽成工具类了,复制下来就能直接用了,直接看代码吧: 高德地图Url Api: http://lbs.amap.com/api/amap-mobile/guide/android/navigation ...

  9. android启动百度地图应用并开始导航,android打开外部地图导航(百度、高德、腾讯)...

    外部打开百度地图进行导航: /*** 打开百度地图*@paramslat开始地点 维度*@paramslon开始地点 经度*@paramsname开始地点 名字*@paramdlat终点地点 维度*@ ...

最新文章

  1. html怎么设置取当前日期格式,js获取当前日期,格式为YYYY-MM-DD
  2. 用Pytorch实现三个优秀的自然图像分割框架!(包括FCN、U-Net和Deeplab,可直接训练预测)
  3. AngularJs ng-repeat限制循环次数
  4. 为什么程序员应该避免间接代码?
  5. java中int和Integer对比的一些坑
  6. python的安装和运行
  7. uniapp ios时间戳获取不到_个人小程序uniapp实战开发(三):数据库设计与文章列表...
  8. 华为海思Hi3798芯片盒子免TTL刷入Ubuntu_NAS系统【教程分享】
  9. Sentinel Slot扩展实践-流控熔断预警实现
  10. select去重 sqlserver_SQLSERVER 去重
  11. CISSP备考大全(完整版)
  12. 给2011年的MacBook Pro和MacBook Air升级到最新系统和做双系统时遇到的问题
  13. 员工转正申请书_新员工转正申请书
  14. 运行java提示找不到符号_运行java代码时出现找不到符号错误怎么解决
  15. MCE公司:MCE 中国生命科学研究促进奖获奖论文集锦三
  16. 2022年天猫女王节的优惠力度比肩618年中大促购物节
  17. 华为m2青春版android7,7吋巨屏跨界之作 华为揽阅M2青春版评测
  18. webp 动画 android,Android加载animated webp的控制和Glide加载GIF
  19. 微信小程序实现Tab选项卡(极简单版)
  20. 干海星怎么吃做法 干海星的功效与作用有哪些

热门文章

  1. BP算法误差逆传播参数更新公式推导
  2. vue打印插件的使用
  3. Partially Labeled Dirichlet Allocation(PLDA)算法的理解与编程细节(Java)
  4. 小程序商城后台技术选型
  5. WiFi-ESP8266入门http(3-2)网页认证上网-post请求
  6. 一站购遍全球 史上最长亚马逊Prime会员日即将开启
  7. 音视频基础:音频(PCM和AAC)
  8. Micropython——关于I2C和SoftI2C以及SPI和SoftSPI的区别
  9. 自然语言处理(NLP)-统计句法分析(CKY算法用于PCFG下的句法分析)
  10. RMAN Encrypted Backups