百度地图导航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
}