Android studio 百度地图开发(10)语音播报的问题:能正常导航,但是无法语音播报

一.前言

第一次做导航时,并没有关注语音播报,今天特意把这个功能完善一下。但是发现关于语音播报的实现也遇到了一些问题,在官方的讨论区也发现关于语音播报的问题特别多,问题基本都是:能正常导航,但是无法语音播报。于是把自己的一些理解和解决方法记录一下,希望能帮助到其他有问题的朋友。

二.需要做的事情

1.配置问题

除了地图显示、定位、导航需要的配置之外,tts播报需要添加白名单,点击前往。如下所示:
Android studio 百度地图开发(10)语音播报的问题:能正常导航,但是无法语音播报_第1张图片
这里有关键地方必须留意:

  • 应用包名:这个基本没问题
  • 应用签名:这个签名不是申请AK时的SHA1,而是打包成apk后的MD5,获取MD5的方式有两种:
    (1)第一种:将apk的文件格式修改为.rar,即压缩包,然后解压,在META-INF文件夹下会有一个CERT.RSA文件,然后命令窗口进入到META-INF,输入keytool -printcert -file CERT.RSA
    Android studio 百度地图开发(10)语音播报的问题:能正常导航,但是无法语音播报_第2张图片
    (2)第二种:打包的时候会生成一个 自命名.jks文件,打包过程请点击查看,最主要的就是这个jks文件。然后在命令窗口进入到这个jks文件的目录,输入keytool -list -v -keystore 自命名.jks,于是就可以看到MD5。
    Android studio 百度地图开发(10)语音播报的问题:能正常导航,但是无法语音播报_第3张图片
    Android studio 百度地图开发(10)语音播报的问题:能正常导航,但是无法语音播报_第4张图片

  • AK:就是之前申请的AK,这个没问题。

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,语音播报)