標籤:
一.前言
第一次做導航時,並沒有關注語音播報,今天特意把這個功能完善一下。但是發現關於語音播報的實現也遇到了一些問題,在官方的討論區也發現關於語音播報的問題特別多,問題基本都是:能正常導航,但是無法語音播報。於是把自己的一些理解和解決方案記錄一下,希望能協助到其他有問題的朋友。
二.需要做的事情1.配置問題
除了地圖顯示、定位、導航需要的配置之外,tts播報需要添加白名單,點擊前往。如下所示:
這裡有關鍵地方必須留意:
2.相關代碼
這兩部分在官方Demo裡就有
1.內部TTS播報狀態回傳handler
private Handler ttsHandler = new Handler() { public void handleMessage(Message msg) { int type = msg.what; switch (type) { //tts播報開始 case BaiduNaviManager.TTSPlayMsgType.PLAY_START_MSG: { //showToastMsg("Handler : TTS play start"); break; } //tts播報結束 case BaiduNaviManager.TTSPlayMsgType.PLAY_END_MSG: { //showToastMsg("Handler : TTS play end"); break; } default : break; } } };
2.服務授權和初始化
private void initNavi() { BaiduNaviManager.getInstance().init(this, mSDCardPath, APP_FOLDER_NAME, new BaiduNaviManager.NaviInitListener() { @Override public void onAuthResult(int status, String msg) { String authinfo; if (0 == status) { authinfo = "key校正成功!"; } else { authinfo = "key校正失敗, " + msg; } DriveRouteActivity.this.runOnUiThread(new Runnable() { @Override public void run() {}}); } public void initSuccess() { initSetting(); } public void initStart() {} public void initFailed() {}}, ttsHandler,//前面定義過的tts播報回傳handler null); }
3.進入導航
BaiduNaviManager .getInstance() .launchNavigator( DriveRouteActivity.this, //建議是應用的主Activity list, //傳入的算路節點,順序是起點、途經點、終點,其中途經點最多三個 2, //算路偏好 1:推薦 8:少收費 2:高速優先 4:少走高速 16:躲避擁堵 true, //true表示真實GPS導航,false表示類比導航,據我所知,新的SDK中,類比導航不支援語音播報 new DemoRoutePlanListener(sPNode)//開始導航回調監聽器,在該監聽器裡一般是進入導航過程頁面 );
三.為什麼能導航但是不能語音播報
理論上,通過配置工作和上面的三部分代碼就可以搞定語音播報的功能了。但是往往在細節上錯誤,會導致能征程導航但是無法語音播報,以下是我的一些理解和方案,僅供參考,大家可以從這些方面去排查錯誤。
(1)tts白名單的簽名來自於apk,所以在開發階段應該是不能語音播報的,因為開發階段的簽名和打包後的簽名不一致;至少我個人的問題是這樣,開發階段是不能語音播報的,將apk安裝到手機後就可以正常語音播報了;
(2)使用比較新的SDK,類比導航不支援語音播報;
Android studio 百度地圖開發(10)語音播報的問題:能正常導航,但是無法語音播報