APP跳转第三方地图应用

278 阅读2分钟

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",  // Google 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
    }


    /**
* 是否安装了该包名的app
*
* @param pkgName 包名
* @ return 是否安装
*/
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: 引用的应用名称