最近发现以前开发的一款集成了百度地图导航功能的APP在某些品牌手机上如华为、魅族等出现无法起调导航功能的问题,在查阅了大量官网和其它论坛的一些资料和博客后,分析并总结出了可以解决该问题的方法。
先来看下原先起调导航的实现方法:
/**
* 开始导航
*
* @param view
*/
public void startNavi() {
//起点经纬坐标
LatLng pt1 = new LatLng(mStart_Lat1, mStart_Lon1);
//终点经纬坐标
// 构建 导航参数
NaviParaOption para = new NaviParaOption();
para.startPoint(pt1);
para.startName("从这里开始");
para.endPoint(pt2);
para.endName ("到这里结束");
try {
Log.e(TAG, "call navi");
boolean opennavi = BaiduMapNavigation.openBaiduMapNavi(para, this);
Log.e(TAG, "opennavi="+opennavi);
if(!opennavi)
{
Log.e(TAG, "call baidumap navi failed");
}
} catch (BaiduMapAppNotSupportNaviException e) {
e.printStackTrace();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("您尚未安装百度地图app或app版本过低,点击确认安装?");
builder.setTitle("提示");
builder.create().show();
}
}
上述方法是直接使用百度地图SDK提供的BaiduMapNavigation.openBaiduMapNavi接口进行起调导航,我在使用华为荣耀7或魅族pro6等手机进行测试时,当百度地图app在后台运行时,是可以调起导航界面的,但是当关闭百度地图应用程序后,则无法调起导航。之后通过分析和总结,归纳出了以下方面可以解决该问题。
先来看下改进后的方法代码:
/**
* 开始导航
*
* @param view
*/
public void startNavi() {
//起点经纬坐标
LatLng pt1 = new LatLng(mStart_Lat1, mStart_Lon1);
//终点经纬坐标
LatLng pt2 = new LatLng(mEndLat2, mEndLon2);
// 构建 导航参数
NaviParaOption para = new NaviParaOption();
para.startPoint(pt1);
para.startName("从这里开始");
para.endPoint(pt2);
para.endName ("到这里结束");
if(isAvilible(getApplicationContext(), "com.baidu.BaiduMap")){
try {
Intent intent;
try {
intent = Intent.getIntent("intent://map/direction?origin=latlng:"+mStart_Lat1+","+mStart_Lon1+"|name:从这里开始&destination="
+"latlng:"+mEndLat2+","+ mEndLon2+"|name:到这里结束"+"&mode=driving®ion=南京&referer=Autohome|GasStation#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
startActivity(intent); //启动调用
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("您尚未安装百度地图app或app版本过低,点击确认安装?");
builder.setTitle("提示");
builder.create().show();
}
}else{
//网页应用调起导航
BaiduMapNavigation.openWebBaiduMapNavi(para, this);
}
}
/**
* @function:判断手机是否安装了某应用
* @param context
* @param packageName
* @return
*/
private boolean isAvilible(Context context, String packageName){
final PackageManager packageManager = context.getPackageManager();//获取packagemanager
List< PackageInfo> pinfo = packageManager.getInstalledPackages(0);//获取所有已安装程序的包信息
List<String> pName = new ArrayList<String>();//用于存储所有已安装程序的包名
//从pinfo中将包名字逐一取出,压入pName list中
if(pinfo != null){
for(int i = 0; i < pinfo.size(); i++){
String pn = pinfo.get(i).packageName;
pName.add(pn);
}
}
return pName.contains(packageName);//判断pName中是否有目标程序的包名,有TRUE,没有FALSE
}
上述代码中isAvilible(Context context, String packageName)方法是用来判断手机是否安装了百度地图应用的,若未安装,则使用网页应用调起导航,通过 BaiduMapNavigation.openWebBaiduMapNavi(NaviParaOption nav, Context context)方法实现;已安装百度地图,则使用百度地图导航的协议规范(参考链接),获得Intent对象,然后通过startActivity(intent),即可调起百度地图导航界面。
至此该问题算是得以解决啦,祝大家工作、生活开心快乐!