Android百度地图导航出现无法起调问题的解决方法

本文介绍了一款集成百度地图导航功能的APP在部分手机上遇到的问题及解决方案。通过改进导航调用方式,确保即使在后台关闭百度地图的情况下也能正常启动导航。
最近发现以前开发的一款集成了百度地图导航功能的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),即可调起百度地图导航界面。
至此该问题算是得以解决啦,祝大家工作、生活开心快乐!
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值