百度地图导航tts语音静音问题的解决

一. 问题表述:

  • 导入了百度导航demo以后,注册了key,调用导航,看着地图规划页面,听着app里柔软的机器女声:”…到中关村xxx的路线….”,一阵轻松,说明调用成功,只要集成上去就ok了。
  • 集成到自己的项目里,debug签名时,导航和语音都正常;但打正式签名包时,导航路线正常,语音播报没了。

二. 搜索解决方案:

百度地图的论坛有不少类似问题的帖子,有几种解决办法:

  • 需要根据注册百度地图sdk的app_id和签名的md5注册tts语音白名单;
  • 初始化导航时需要填写app_id(集成百度地图sdk的app_id,而不是tts语音白名单的app_id)。
// 必须设置APPID,否则会静音  地图的appid
bundle.putString(BNCommonSettingParam.TTS_APP_ID, "9804011");

if 按照上面两步处理,你的两个包都有声音了,那恭喜你,下面的不用看了, else,继续听我唠叨:

下面直接说我的判断和解决办法

三. 判断:

经过一定数量的测试,发现只要在tts白名单注册了两个签名(debug,release两个签名),那么必定会有一个包的导航没有语音播放,也就是所谓的静音,一般是后注册的那个没声音。 看到这里,有同学要说了,删了一个,另外一个不就ok了,那我就好告诉你了,少年,你太年轻了。即使删了一个也没有用。而且如果你是不小心删掉了,还想再注册同样包名,签名的tts白名单时,系统提示你: already registered。

四. 最终处理:

* 根据以上不完全深入的试验和分析,这次我重新签了一个名,谨慎的注册了百度地图sdk的key,根据这个key又注册了一个发布版签名的tts语音白名单。*


这时候,debug包和正式签名包都能正常语音,那个曼妙的机器女声又回来销魂了。

另外附上一段写好的代码,功能见注释,略显丑陋,还请轻轻嘲笑:

/**
 * 点击'路线',跳转至导航,优先级:百度-->高德-->webapp<br/>
 * 也可以改成弹出选择对话框的交互(用户手动选择导航方式)
 */
public void goChooseNavi(StationBean bean) {
    Log.i(TAG, "进入导航1");
    if (DataUtils.isPkgInstalled(context, "com.baidu.BaiduMap")) {
        DataUtils.gotoBaiduNavi(context, selectedLatLng, bean);
    } else if (DataUtils.isPkgInstalled(context, "com.autonavi.minimap")) {
        DataUtils.gotoGaodeNavi(context, selectedLatLng, bean);
    } else {
        routeplanToNavi(bean);
    }
}

/**
 * 跳转到百度地图app进行导航,
 * @param context
 * @param selectedLatLng 起始点坐标
 * @param station  目的地对象实例
 */
public static void gotoBaiduNavi(Context context, LatLng selectedLatLng, StationBean station) {
    if (station == null) {
        return;
    }

    // 调起百度地图app的方法3
    Intent intent = new Intent();
    String url = "baidumap://map/direction?" +
            "origin=latlng:"+selectedLatLng.latitude+","+selectedLatLng.longitude+"|name:我的位置"+
            "&destination=name:" + station.getStationName() +
            "|latlng:" + station.getBdLat() + "," + station.getBdLon() +
            "&mode=transit&sy=3&index=0&target=1";
    Uri uri = Uri.parse(url);
    //将功能Scheme以URI的方式传入data
    intent.setData(uri);
    //启动该页面即可
    context.startActivity(intent);

}


/**
 * 跳转到高德地图app进行导航
 * @param context
 * @param selectedLatLng    起始点坐标
 * @param station           目的地对象实例
 */
public static void gotoGaodeNavi(Context context, LatLng selectedLatLng, StationBean station) {
    if (station == null) {
        return;
    }

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    String url = "androidamap://route?sourceApplication=amap&slat=" +
            selectedLatLng.latitude + "&slon=" + selectedLatLng.longitude
            + "&dlat=" + station.getBdLat() + "&dlon=" + station.getBdLon() +
            "&dname=" + station.getStationName() + "&dev=0&t=1";
    Uri uri = Uri.parse(url);
    //将功能Scheme以URI的方式传入data
    intent.setData(uri);
    //启动该页面即可
    context.startActivity(intent);
}

/**
 * 是否安装了某款app
 */
public static boolean isPkgInstalled(Context context, String packagename) {
    PackageManager pm = context.getPackageManager();
    try {
        pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

/**
 * 百度导航的demo里有这个方法,我就不写了
 */
private void routeplanToNavi(StationBean station){
   // some code
}