欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-14 13:08:42
...

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

标签: android studio百度地图语音播报导航
2016-05-17 15:05 7281人阅读 评论(2) 收藏 举报
Android studio 百度地图开发(10)语音播报的问题:能正常导航,但是无法语音播报 分类:

目录(?)[+]

一.前言

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

二.需要做的事情

1.配置问题

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

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

  • 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;
            }
        }
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3.进入导航

BaiduNaviManager
    .getInstance()
        .launchNavigator(
            DriveRouteActivity.this,    //建议是应用的主Activity
            list,                           //传入的算路节点,顺序是起点、途经点、终点,其中途经点最多三个
            2,                              //算路偏好 1:推荐 8:少收费 2:高速优先 4:少走高速 16:躲避拥堵
            true,                           //true表示真实GPS导航,false表示模拟导航,据我所知,新的SDK中,模拟导航不支持语音播报
            new DemoRoutePlanListener(sPNode)//开始导航回调监听器,在该监听器里一般是进入导航过程页面
            );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

三.为什么能导航但是不能语音播报

理论上,通过配置工作和上面的三部分代码就可以搞定语音播报的功能了。但是往往在细节上错误,会导致能征程导航但是无法语音播报,以下是我的一些理解和方案,仅供参考,大家可以从这些方面去排查错误。 
(1)tts白名单的签名来自于apk,所以在开发阶段应该是不能语音播报的,因为开发阶段的签名和打包后的签名不一致;至少我个人的问题是这样,开发阶段是不能语音播报的,将apk安装到手机后就可以正常语音播报了; 
(2)使用比较新的SDK,模拟导航不支持语音播报;