在我们App开发过程中,经常会有一个优化用户体验的需求:查看某个地址时,给用户提供出路径规划,进行导航。
如果本身App不属于LBS应用的话,为了一个小功能点就去集成各大地图SDK,有点杀鸡用牛刀的感觉,增加了apk的体积,得不偿失。
那么大家第一个想到的是官方有提供不用集成sdk,就可以调起地图App的方式吗?答案是有的:
下面给出常用的2大地图SDK商的Api地址:
高德地图 https://lbs.amap.com/api/amap-mobile/guide/android/route
百度地图 http://lbsyun.baidu.com/index.php?title=uri/api/android
先来看下判断手机是否安装了该应用的2种方式
public static boolean isApplicationInstall(String packageName){
return new File("/data/data/" + packageName).exists();
}
public static boolean isAvilible(Context context, String packageName) {
//获取packagemanager
final PackageManager packageManager = context.getPackageManager();
//获取所有已安装程序的包信息
List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
//用于存储所有已安装程序的包名
List<String> packageNames = new ArrayList<String>();
//从pinfo中将包名字逐一取出,压入pName list中
if (packageInfos != null) {
for (int i = 0; i < packageInfos.size(); i++) {
String packName = packageInfos.get(i).packageName;
packageNames.add(packName);
}
}
//判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE
return packageNames.contains(packageName);
}
看过2家APi文档的话,会发现百度地图在允许第三方App调用百度地图App进行路径规划时,只需要入参一个目的地址即可,不需要提供经纬度,这点就很人性化了,点个赞:
try {
StringBuffer stringBuffer = new StringBuffer("baidumap://map/direction?")
.append("destination=" + '目的地地址')
.append("&mode=driving")
.append("&src=自己App的包名");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
intent.setPackage("com.baidu.BaiduMap");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
但是高德地图除了目的地址外还需要经纬度,比较坑,但是也是有办法解决,可以调用高德地图的Web Api服务,先通过地址编码 拿到经纬度,再将其作为参数传递即可。
1.先进行地理编码
使用方式:get请求 https://restapi.amap.com/v3/geocode/geo?address=" + ‘目的地地址’+ "&key=去高德平台申请key即可")
参考文档:Web服务 API>地理/逆地理编码https://lbs.amap.com/api/webservice/guide/api/georegeo
2.Intent式调起
try {
Intent intent = new Intent(Intent.ACTION_VIEW,
android.net.Uri.parse("amapuri://route/plan/?sourceApplication=自己App应用包名&dname="
+ 终点名称
+ "&dlat=" + 终点纬度
+ "&dlon=" + 终点经度
+ + "&dev=0&t=0"));
intent.setPackage("com.autonavi.minimap");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
那假设用户手机都没装这2个App,该怎么破呢?可以采用终极大法
Web方式打开地图,这里还是推荐百度的Web地图,因为其还是很简单只需要一个目的地址即可:
参考链接: http://lbsyun.baidu.com/index.php?title=uri/api/web
使用方式
Uri uri = Uri.parse("http://api.map.baidu.com/geocoder?address=" + 目的地址 + "&output=html&src=自己App包名");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);