天天看點

android跳轉其他app地圖高德、百度、騰訊導航

  • 首先是高德、騰訊、百度的包名
//1.百度地圖包名
	public static final String BAIDUMAP_PACKAGENAME = "com.baidu.BaiduMap";
	//2.高德地圖包名
	public static final String AUTONAVI_PACKAGENAME = "com.autonavi.minimap";
	//3.騰訊地圖包名
	public static final String QQMAP_PACKAGENAME = "com.tencent.map";
           
  • 使用packageManager檢查應用安裝了那些地圖軟體
private static final String[] MAP_PACKAGES = {BAIDUMAP_PACKAGENAME, AUTONAVI_PACKAGENAME, QQMAP_PACKAGENAME};
List<String> packages = checkInstalledPackage(MAP_PACKAGES);
/**
	 * 檢查手機上是否安裝了指定的軟體
	 *
	 * @param packageNames 可變參數 String[]
	 * @return 目标軟體中已安裝的清單
	 */
	public static List<String> checkInstalledPackage(String... packageNames) {

		//擷取packageManager
		final PackageManager packageManager = sContext.getPackageManager();
		//擷取所有已安裝程式的包資訊
		List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
		//用于存儲
		List<String> newPackageNames = new ArrayList<>();
		int count = packageNames.length;

		if (packageInfos != null && packageInfos.size() > 0) {

			outermost:for (String packageName : packageNames) {
				for (int i = 0; i < packageInfos.size(); i++) {
					String packageInfo = packageInfos.get(i).packageName;
					if (packageInfo.contains(packageName)) {
						newPackageNames.add(packageName);
						if (newPackageNames.size() == count) {
							break outermost;//這裡使用了循環标記,跳出外層循環
						}
					}
				}
			}
		}
		//判斷packageNames中是否有目标程式的包名,有TRUE,沒有FALSE
		return newPackageNames;
	}
           
  • 如果packages.size() == 0 表明未安裝高德、百度、騰訊地圖
  • 不為0則switch進行調用
    if (packages.size() == 0) {
    			MyToast.show("請安裝地圖應用", Toast.LENGTH_LONG);
    		} else {
    			for (String packageName : packages) {
    
    				switch (packageName) {
    					case BAIDUMAP_PACKAGENAME:
    						invokeBaiDuMap(context, arg);
    						break;
    					case AUTONAVI_PACKAGENAME:
    						invokeAuToNaveMap(context, arg);
    						break;
    					case QQMAP_PACKAGENAME:
    						invokeQQMap(context, arg);
    						break;
    				}
    			}
    		}
               
    • 下面介紹一下三個arg的格式和三個調用方法
    /**
    	 * 調用百度地圖----------------
    	 *
    	 * @param context 上下文對象
    	 * @param arg     參數
    	 */
    	private static void invokeBaiDuMap(Context context, Map arg) {
    
    		try {
    			Uri uri = Uri.parse("baidumap://map/geocoder?" +
    					"location=" + arg.get(GCJO2_LAT) + "," + arg.get(GCJO2_LNG) +
    					"&name=" + arg.get(DESTINATION) + //終點的顯示名稱
    					"&coord_type=gcj02");//坐标 (百度同樣支援他自己的db0911的坐标,但是高德和騰訊不支援)
    			Intent intent = new Intent();
    			intent.setPackage(BAIDUMAP_PACKAGENAME);
    			intent.setData(uri);
    
    			context.startActivity(intent);
    		} catch (Exception e) {
    			Logger.e(TAG, e.getMessage());
    		}
    
    	}
    
    	/**
    	 * 調用高德地圖
    	 *
    	 * @param context 上下文對象s
    	 * @param arg     經緯度參數map
    	 */
    	private static void invokeAuToNaveMap(Context context, Map arg) {
    
    		try {
    			Uri uri = Uri.parse("androidamap://route?sourceApplication={你的應用名稱}" +
    					"&dlat=" + arg.get(GCJO2_LAT)//終點的緯度
    					+ "&dlon=" + arg.get(GCJO2_LNG)//終點的經度
    					+ "&dname=" + arg.get(DESTINATION)終點的顯示名稱
    					+ "&dev=0&m=0&t=0");
    			Intent intent = new Intent("android.intent.action.VIEW", uri);
    			intent.addCategory("android.intent.category.DEFAULT");
    
    			context.startActivity(intent);
    		} catch (Exception e) {
    			Logger.e(TAG, e.getMessage());
    		}
    
    	}
    
    	/**
    	 * 調用騰訊地圖
    	 *
    	 * @param context 上下文對象s
    	 * @param arg     經緯度參數map
    	 */
    	private static void invokeQQMap(Context context, Map arg) {
    		try {
    			Uri uri = Uri.parse("qqmap://map/routeplan?type=drive" +
    					"&to=" + arg.get(DESTINATION)//終點的顯示名稱 必要參數
    					+ "&tocoord=" + arg.get(GCJO2_LAT) + "," + arg.get(GCJO2_LNG)//終點的經緯度
    					+ "&referer={你的應用名稱}");
    			Intent intent = new Intent();
    			intent.setData(uri);
    
    			context.startActivity(intent);
    		} catch (Exception e) {
    			Logger.e(TAG, e.getMessage());
    		}
    	}
               
  • arg的字段
    /**
    	 * 參數的key
    	 * 高德的坐标系 "gd_lng" (高德_經度)、"gd_lat"(緯度)、"destination"(目的地名稱)
    	 */
    	private static final String GCJO2_LNG = "gd_lng";
    	private static final String GCJO2_LAT = "gd_lat";
    	private static final String DESTINATION = "destination";
               
  • 關于終點名稱顯示,在騰訊地圖中目的地顯示名稱是必要參數,在騰訊和高德地圖不是必要的。未配置不會顯示終點名稱。
  • 關于定位不精準,需要注意經緯度坐标系的問題,如果傳入的是百度地圖定位出的經緯度,需要轉成國測局加密的坐标系(在國内等同于GCJ02坐标系和GPS定位的坐标系),因為騰訊和高德不支援直接傳百度坐标系的參數(db911),如果隻用百度地圖他自己倒是支援的。
  • 有幫助的請點個贊
android跳轉其他app地圖高德、百度、騰訊導航