1. 获取对应地图是否安装
- Android 11及以上版本必须要QUERY_ALL_PACKAGES权限
```
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
```
- QUERY_ALL_PACKAGES权限会使应用具有合规性问题,另一种方法Android11及以上版本也能正常获取对应应该是否安装,需要在AndroidManifest.xml里面添加对应应用包名
```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>-->
<queries>
<package android:name="com.google.android.apps.maps"/>
<package android:name="com.autonavi.minimap"/>
<package android:name="com.baidu.BaiduMap"/>
<package android:name="com.tencent.map"/>
</queries>
</manifest>
```
- 判断对应地图包名是否安装
```
object MapAppDetector {
const val TAG: String = "MapApps"
private val MAP_APP_PACKAGES = arrayOf(
"com.google.android.apps.maps",
"com.autonavi.minimap",
"com.baidu.BaiduMap",
"com.tencent.map",
)
fun getInstalledMapApps(packageManager: PackageManager): List<String> {
val installedMapApps: MutableList<String> = ArrayList()
for (s in MAP_APP_PACKAGES) {
if (isPackageInstalled(packageManager, s)) {
installedMapApps.add(s)
}
}
return installedMapApps
}
private fun isPackageInstalled(packageManager: PackageManager, pkgName: String): Boolean {
try {
val pkgInfo = packageManager.getPackageInfo(pkgName, 0)
return pkgInfo != null && pkgInfo.applicationInfo.enabled
} catch (e: PackageManager.NameNotFoundException) {
}
return false
}
}
```
2. 通过经纬度打开对应地图app进入导航开始页面
2.1 Google地图
1. ```
val uri =
"https://www.google.com/maps/dir/?api=1&destination=$destinationLat,$destinationLng"
val mapIntent = Intent(Intent.ACTION_VIEW, Uri.parse(uri))
mapIntent.setPackage("com.google.android.apps.maps")
```
参数说明:
- destination: 目的地坐标(纬度,经度)
2.2 百度地图
1. ```
val uri = Uri.parse("baidumap://map/direction?destination=latlng:$destinationLat,$destinationLng|name:目的地")
val mapIntent = Intent(Intent.ACTION_VIEW, uri)
mapIntent.setPackage("com.baidu.BaiduMap")
```
参数说明:
- destinationLat: 目的地纬度
- destinationLng: 目的地经度
- name: 目的地名称(如:北京)
2.3 高德地图
1. ```
val uri =
"amapuri://route/plan/?sourceApplication=你应用的名称&dlat=$destinationLat&dlon=$destinationLng&dname=目的地&dev=0&m=0&t=0"
val mapIntent = Intent(Intent.ACTION_VIEW, Uri.parse(uri))
mapIntent.setPackage("com.autonavi.minimap")
```
参数说明:
- sourceApplication: 源应用名称
- dlat: 目的地纬度
- dlon: 目的地经度
- dname: 目的地名称(如:北京)
- dev: 设备类型(0表示手机)
- m: 导航模式(0表示驾车)
- t: 交通方式(0表示普通路线)
2.4 腾讯地图
1. ```
val uri = "qqmap://map/routeplan?type=drive&to=目的地&tocoord=$destinationLat,$destinationLng&policy=0&referer=我的应用名"
val mapIntent = Intent(Intent.ACTION_VIEW, Uri.parse(uri))
mapIntent.setPackage("com.tencent.map")
```
参数说明:
- type: 导航类型(drive表示驾车)
- to: 目的地名称(如:北京)
- tocoord: 目的地坐标(纬度,经度)
- policy: 规划策略(0表示推荐路线)
- referer: 引用的应用名称