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 packages = checkInstalledPackage(MAP_PACKAGES);
/**
	 * 检查手机上是否安装了指定的软件
	 *
	 * @param packageNames 可变参数 String[]
	 * @return 目标软件中已安装的列表
	 */
	public static List checkInstalledPackage(String... packageNames) {

		//获取packageManager
		final PackageManager packageManager = sContext.getPackageManager();
		//获取所有已安装程序的包信息
		List packageInfos = packageManager.getInstalledPackages(0);
		//用于存储
		List 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)