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

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<LatLng>) {
        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<LatLng>) {
        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<LatLng>);

功成身退,成败得失

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容