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);

橙子主题打折出售

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

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

热门文章

Adobe Acrobat Pro 激活 这里记录了一些AdobeAcrobat的激活教程和组件。浏览量:1,987 作者:Pastore Antonio
1830 浏览量
“sudo: apt-get:找不到命令”的解决方法 Linux系统:CentOS7原因分析:这是由于CentOS的软件安装工具不是apt-get,而是...“sudo:apt-get:找不到命令”的解决方法 作者:Pastore Antonio
1540 浏览量
一个不可思议的一天 上周五可以说是我人生中的梦魇……因为时间没安排好,为了一个10几分钟的会议,打的花了100多。然...一个不可思议的一天 作者:Pastore Antonio
1532 浏览量
Win10中使用cmd命令快速安装telnet服务 Win10中不能够使用Telnet的主要原因是由于系统默认情况下是没有安装telnet服务的,所以我...Win10中使用cmd命令快速安装telnet服务 作者:Pastore Antonio
1524 浏览量
Windows Server IIS+ARR反向代理(配置反向代理服务器) 1.概念说明:反向代理反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相...WindowsServerIIS+ARR反向代理(配置反向代理服务器) 作者:Pastore Antonio
1518 浏览量