上篇資訊我們講到了在地圖中通過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"));