Logo

Android不集成sdk直接调起原生地图App 路径规划、导航

photo

2023年09月19日

在我们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);

橙子主题打折出售

其实我不卖,主要是这里是放广告的,所以就放了一个
毕竟主题都没做完,卖了也是坑.

购买它
本文为原创文章,请注意保留出处!

热门文章

修复群晖Synology Drive client右键菜单缺失问题 本教程主要解决windows10右键菜单中没有SynologyDrive菜单的问题,整体思路是找到...修复群晖SynologyDriveclient右键菜单缺失问题 作者:Pastore Antonio
1980 浏览量
docker如何查看一个镜像内部的目录结构及其内部都有哪些文件 前言:有时候我们会在docker上下载一个镜像,或者是上传一个镜像到docker上,甚至有时候就是在...docker如何查看一个镜像内部的目录结构及其内部都有哪些文件 作者:Pastore Antonio
1922 浏览量
Adobe Acrobat Pro 激活 这里记录了一些AdobeAcrobat的激活教程和组件。浏览量:1,806 作者:Pastore Antonio
1649 浏览量
追寻日出,找回自己 为什么我要去追寻日出?其实我是一个很懒的人,每次都起不来,直到有一次我在租房中睡到了大天亮,阳光照...追寻日出,找回自己 作者:Pastore Antonio
1606 浏览量
Swagger2 接口多级分组方法 swagger无疑是Java开发的最佳伴侣,接口非常方便调试;当然也有用Postman,因人而异吧...Swagger2接口多级分组方法 作者:Pastore Antonio
1522 浏览量