Android app唤醒第三方地图App进行导航(高德,百度,腾讯)

根据项目需要 要添加导航功能 由于我的app 的内部已经做了地图和路线规划 同时为了使用用户的使用习惯 我选择了第三方导航 选择用户已有地图软件进行路线规划和导航
我选择的是目前的主流地图app平台 高德 百度 腾讯 三种导航软件 至于google 地图 由于某些原因 我放弃掉了

说一下我的思路
先检索手机是否安装了目标地图app(高德,百度,腾讯) 如果有安装其中之一 提示用户跳转打开地图 如果没有安装 提示安装

看一下实现吧 相对来说很简单 其他的就不多说了 直接上代码

好了 为了方便大家 我把三个app 的Android技术文档连接放在这里 供大家参考

高德api点击查看

Android app唤醒第三方地图App进行导航(高德,百度,腾讯)_第1张图片

腾讯api点击查看

Android app唤醒第三方地图App进行导航(高德,百度,腾讯)_第2张图片

百度api

Android app唤醒第三方地图App进行导航(高德,百度,腾讯)_第3张图片

看了这些 思路应该更加清楚了

下面是我编写的工具类

// 检索地图软件
public static boolean isAvilible(Context context, String packageName){
//获取packagemanager
final PackageManager packageManager = context.getPackageManager();
//获取所有已安装程序的包信息
List packageInfos = packageManager.getInstalledPackages(0);
//用于存储所有已安装程序的包名
List packageNames = new ArrayList();
//从pinfo中将包名字逐一取出,压入pName list中
if(packageInfos != null){
for(int i = 0; i < packageInfos.size(); i++){
String packName = packageInfos.get(i).packageName;
packageNames.add(packName);
}
}
//判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE
return packageNames.contains(packageName);
}

/**
* 指定地图
*百度地图包名:com.baidu.BaiduMap

 高德地图包名:com.autonavi.minimap

 腾讯地图包名:com.tencent.map

 谷歌地图 com.google.android.apps.maps
 *
 */
public List mapsList (){
    List maps = new ArrayList<>();
    maps.add("com.baidu.BaiduMap");
    maps.add("com.autonavi.minimap");
    maps.add("com.tencent.map");
    return maps;
}

// 检索筛选后返回
public  List hasMap (Context context){
    List mapsList = mapsList();
    List backList = new ArrayList<>();
    for (int i = 0; i < mapsList.size(); i++) {
        boolean avilible = isAvilible(context, mapsList.get(i));
       if (avilible){
           backList.add(mapsList.get(i));
       }
    }
    return backList;
}

选择窗口 并实现唤醒目标app进行导航

public class MapToast {
public void showChooseMap(Context context, View rootView,HisLocationBean bean){
CommonPopupWindow popupWindow=new CommonPopupWindow.Builder(context)
.setView(R.layout.map_toast)
.setWidthAndHeight(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT)
.setBackGroundLevel(0.5f)
.setViewOnclickListener((view, layoutResId, popupWindow1) -> {
View map_toast_cancelbt = view.findViewById(R.id.map_toast_cancelbt);
View map_toast_gaodebt = view.findViewById(R.id.map_toast_gaodebt);
View map_toast_baidubt = view.findViewById(R.id.map_toast_baidubt);
View map_toast_tencentbt = view.findViewById(R.id.map_toast_tencentbt);
View map_toast_hinttv = view.findViewById(R.id.map_toast_hinttv);

                List hasMap = new ThridMapUtil().hasMap(context);
                for (int i = 0; i < hasMap.size(); i++) {
                    if (hasMap.get(i).contains("com.autonavi.minimap")){
                        map_toast_gaodebt.setVisibility(View.VISIBLE);
                    }else if (hasMap.get(i).contains("com.baidu.BaiduMap")){
                        map_toast_baidubt.setVisibility(View.VISIBLE);
                    }else if (hasMap.get(i).contains("com.tencent.map")){
                        map_toast_tencentbt.setVisibility(View.VISIBLE);
                    }
                }
                if (hasMap.size() == 0){
                    map_toast_hinttv.setVisibility(View.VISIBLE);
                }
                map_toast_cancelbt.setOnClickListener(view1 -> {
                    popupWindow1.dismiss();
                });
                map_toast_gaodebt.setOnClickListener(view1 -> {

                    toGaodeNavi(context,bean);
                    popupWindow1.dismiss();
                });
                map_toast_baidubt.setOnClickListener(view1 -> {
                    toBaidu(context,bean);
                    popupWindow1.dismiss();

                });
                map_toast_tencentbt.setOnClickListener(view1 -> {

                    toTencent(context,bean);
                    popupWindow1.dismiss();
                });
                
            }).setOutsideTouchable(true)
            .create();
    popupWindow.showAtLocation(rootView, Gravity.BOTTOM,0,0);
}

// 百度地图
public void toBaidu(Context context, HisLocationBean bean){
    
    Intent intent= new Intent("android.intent.action.VIEW", android.net.Uri.parse("baidumap://map/geocoder?location=" + bean.getLat() + "," + bean.getLon()));
    context.startActivity(naviIntent);
}
// 高德地图
public void toGaodeNavi(Context context,HisLocationBean bean){
    Intent intent= new Intent("android.intent.action.VIEW", android.net.Uri.parse("androidamap://route?sourceApplication=appName&slat=&slon=&sname=我的位置&dlat="+ bean.getLat() +"&dlon="+ bean.getLon()+"&dname=目的地&dev=0&t=2"));
    context.startActivity(naviIntent);
}
// 腾讯地图
public void toTencent(Context context,HisLocationBean bean){
    Intent intent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("qqmap://map/routeplan?type=drive&from=&fromcoord=&to=目的地&tocoord=" + bean.getLat() + "," + bean.getLon() + "&policy=0&referer=appName"));
    context.startActivity(naviIntent);


}
}

window的xml文件



    
    
    
    
    

说在最后 文中提供了google 的包名 google地图api文档 感兴趣朋友可以看一下

你可能感兴趣的:(android开发)