需求:在APP中唤起地图应用(高德地图/百度地图/腾讯地图)进行路线规划、导航。
前提:系统支持(即系统支持唤起第三方地图软件,并直接进入对应的模块,目前来看,Android、iOS、web/h5都是支持的)。
原理:使用地图方(高德地图/百度地图/腾讯地图)开放的能力。
链接:
高德地图:https://lbs.amap.com/api/amap-mobile/guide/android/navigation
百度地图:http://lbsyun.baidu.com/index.php?title=uri/api/android
腾讯地图:https://lbs.qq.com/webApi/uriV1/uriGuide/uriMobileRoute
就Android端,APP唤起地图应用(高德地图/百度地图/腾讯地图)进行路线规划,具体如何实现,下面我们来看:
首先,来一个本需求相关的功能实现,即判断手机上是否安装了相关软件。
/**
* 判断手机上是否安装了指定应用程序
* @param context
* @param packageName
* @return
*/
public static boolean appInstalled(Context context, String packageName) {
PackageManager packageManager = context.getPackageManager();
List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
if (packageInfos != null) {
for (int i = 0; i < packageInfos.size(); i++) {
if (packageName.equals(packageInfos.get(i).packageName)) {
return true;
}
}
return false;
} else {
return false;
}
}
}
回归正题,
1、高德地图
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("androidamap://route/plan?"); //路线规划
stringBuilder.append("&dlat=").append(30.267443);
stringBuilder.append("&dlon=").append(120.152792);
stringBuilder.append("&dname=").append("浙江省政府");
stringBuilder.append("&dev=").append(0); //是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密)
intent.setData(Uri.parse(stringBuilder.toString()));
intent.setPackage("com.autonavi.minimap");
startActivity(intent);
附加高德地图导航
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("androidamap://navi?sourceApplication=amap"); //导航
stringBuilder.append("&lat=").append(30.267443);
stringBuilder.append("&lon=").append(120.152792);
stringBuilder.append("&dev=").append(0); //是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密)
intent.setData(Uri.parse(stringBuilder.toString()));
intent.setPackage("com.autonavi.minimap");
startActivity(intent);
2、百度地图
Intent intent = new Intent();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("baidumap://map/direction?destination=name:");
stringBuilder.append("浙江省政府");
stringBuilder.append("|").append("latlng:");
stringBuilder.append(30.267443);
stringBuilder.append(",");
stringBuilder.append(120.152792);
stringBuilder.append("&coord_type=gcj02"); //设置坐标类型为经国测局加密的坐标
intent.setData(Uri.parse(stringBuilder.toString()));
intent.setPackage("com.baidu.BaiduMap");
startActivity(intent);
3、腾讯地图
Intent intent = new Intent();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("qqmap://map/routeplan?");
stringBuilder.append("type=drive");
stringBuilder.append("&to=").append("浙江省政府");
stringBuilder.append("&tocoord=").append(30.267443).append(",").append(120.152792);
intent.setData(Uri.parse(stringBuilder.toString()));
intent.setPackage("com.tencent.map");
startActivity(intent);