天天看點

關于高德地圖問題總結 (七)調起本地地圖導航

上篇資訊我們講到了在地圖中通過Search類進行動态路線規劃,這篇我們來講到通過app 調起手機自帶的導航軟體,進行路線的查詢。顯示的效果

關于高德地圖問題總結 (七)調起本地地圖導航

我們這邊需要先自定義需要的彈窗布局,在使用者點選的時候,彈出選擇布局,然後進行指定軟體的導航選擇。我們這邊預設規劃的路線是駕車路線,可以在調起api裡面進行設定,下面我們來看實作;

1、先确定我們需要實作的幾個地圖,我們這邊就先介紹常用的,高德、百度、騰訊這幾款。

public static final String PN_GAODE_MAP = "com.autonavi.minimap";// 高德地圖包名
public static final String PN_BAIDU_MAP = "com.baidu.BaiduMap"; // 百度地圖包名
public static final String PN_TENCENT_MAP = "com.tencent.map"; // 騰訊地圖包名
           

2、我們提供一個MapUtil工具類,暴露接口可以直接給其他地方調用。

public class MapUtils {
    public static final String PN_GAODE_MAP = "com.autonavi.minimap";// 高德地圖包名
    public static final String PN_BAIDU_MAP = "com.baidu.BaiduMap"; // 百度地圖包名
    public static final String PN_TENCENT_MAP = "com.tencent.map"; // 騰訊地圖包名

    private static Context mContext;
    private static double startLat;
    private static double startLng;
    private static String startName;
    private static double endLat;
    private static double endLng;
    private static String endName;


    public static void startDialog(Context mContext, double startLat, double startLng, String startName, double endLat, double endLng, String endName){
        MapUtils.mContext = mContext;
        MapUtils.startLat = startLat;
        MapUtils.startLng = startLng;
        MapUtils.endLat = endLat;
        MapUtils.endLng = endLng;
        MapUtils.endName = endName;
        BottomDialog dialog = BottomDialog.create(((FragmentActivity) mContext).getSupportFragmentManager());
        boolean flag = isPackageInstalled(mContext,PN_BAIDU_MAP);
        boolean flag1 = isPackageInstalled(mContext,PN_GAODE_MAP);
        if(flag || flag1){
            int dpValue = 70 + 50 * ((flag ? 1:0) +(flag1 ? 1:0));
            dialog.setLayoutRes(R.layout.dialog_select_map)
                    .setHeight(MSizeUtils.dp2px(mContext, dpValue))
                    .show();
        }else{
            ToastUtil.show("未安裝地圖導航軟體");
        }

        dialog.setViewListener(v -> {
            TextView tvBaidu = v.findViewById(R.id.tv_baidu);
            TextView tvGaode = v.findViewById(R.id.tv_gaode);
            TextView tvCancledialog = v.findViewById(R.id.tv_cancledialog);
            tvBaidu.setVisibility(flag ? View.VISIBLE : View.GONE);
            tvGaode.setVisibility(flag1 ? View.VISIBLE : View.GONE);
            tvBaidu.setOnClickListener(v1 -> {
                // 百度地圖
                double[] start = gaoDeToBaidu(startLng,startLat);
                double[] end = gaoDeToBaidu(endLng,endLat);
                Intent naviIntent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("baidumap://map/direction?origin=name:"+startName+"|latlng:"+start[1]+","+start[0]+"&destination=latlng:"+end[1]+","+end[0]+"|name:"+endName+"&mode=driving"));
                mContext.startActivity(naviIntent);
                dialog.dismiss();
            });
            tvGaode.setOnClickListener(v12 -> {
                // 高德地圖
                Intent naviIntent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("androidamap://route?sourceApplication=appName&slat="+startLat+"&slon="+startLng+"&sname="+startName+"&dlat="+endLat+"&dlon="+endLng+"&dname="+endName+"&dev=0&t=2"));
                mContext.startActivity(naviIntent);
                dialog.dismiss();
            });
            /*tvTengxun.setOnClickListener(v13 -> {
                // 騰訊地圖
                Intent naviIntent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("qqmap://map/routeplan?type=drive&from=&fromcoord=&to=目的地&tocoord=114.347061,34.815321&policy=0&referer=appName"));
                mContext.startActivity(naviIntent);
                dialog.dismiss();
            });*/
            tvCancledialog.setOnClickListener(v14 -> dialog.dismiss());
        });
    }
}
           

我們提供了startDialog()的方法,需要傳入開始坐标、和結束坐标、起始名稱和目的地名稱。然後根據手機端擷取目前手機端安裝的地圖軟體

/**
     * 擷取指定包名的應用是否安裝
     * @param mContext
     * @param packagename
     * @return
     */
    public static boolean isPackageInstalled(Context mContext, String packagename) {
        PackageInfo packageInfo = null;
        try {
            packageInfo = mContext.getPackageManager().getPackageInfo(packagename, 0);
        } catch (PackageManager.NameNotFoundException e) {
            packageInfo = null;
            e.printStackTrace();
        } finally {
            return packageInfo == null ? false : true;
        }
    }
           

調起api的方法

①高德地圖:

Intent naviIntent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("androidamap://route?sourceApplication=appName&slat="+startLat+"&slon="+startLng+"&sname="+startName+"&dlat="+endLat+"&dlon="+endLng+"&dname="+endName+"&dev=0&t=2"));
           

② 百度地圖: 可以修改mode=driving 來指定導航的方式是駕車還是步行。

transit(公交)、

driving(駕車)、

walking(步行)和riding(騎行)

還有其他詳情可參考 [https://lbsyun.baidu.com/index.php?title=uri/api/android]

Intent naviIntent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("baidumap://map/direction?origin=name:"+startName+"|latlng:"+start[1]+","+start[0]+"&destination=latlng:"+end[1]+","+end[0]+"|name:"+endName+"&mode=driving"));
           

③ 騰訊地圖 type 參數為導航模式type=drive

Intent naviIntent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("qqmap://map/routeplan?type=drive&from=&fromcoord=&to=目的地&tocoord=114.347061,34.815321&policy=0&referer=appName"));