Android跳转高德、腾讯、百度地图进行目的地导航

816 阅读1分钟

一、检测是否安装相应APP

1.1 manifest中配置queries

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <package android:name="com.autonavi.minimap" />
        <package android:name="com.tencent.map" />
        <package android:name="com.baidu.BaiduMap" />
    </queries>
</manifest>

1.2 检测是否安装工具类

object AppIsInstalledUtils {

    fun appIsInstall(context: Context, packageName: String): Boolean {
        if (packageName.isEmpty()) {
            return false
        }
        return queryPackageInstall(context, packageName)
    }

    /**
     * 通过签名判断是否安装
     *
     * PackageManager.GET_SIGNATURES 签名
     * PackageManager.GET_SIGNING_CERTIFICATES 签名证书
     */
    private fun queryPackageInstall(context: Context, packageName: String): Boolean {
        if (packageName.isEmpty()) {
            return false
        }
        var isInstall = false
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES)
            } else {
                context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
            }
            isInstall = true
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return isInstall
    }
}

1.3 坐标系互转

/**
 * GCJ-02(高德和腾讯) -> BD-09(百度)
 */
private fun gcj02ToBd09Batch(lat: Double, lng: Double): LatLng{
    val bd = LatLng(lat, lng)
    val x = bd.longitude
    val y = bd.latitude
    val z = kotlin.math.sqrt(x * x + y * y) + 0.00002 * kotlin.math.sin(y * Math.PI)
    val theta = atan2(y, x) + 0.000003 * kotlin.math.cos(x * Math.PI)
    val tempLon = z * kotlin.math.cos(theta) + 0.0065
    val tempLat = z * kotlin.math.sin(theta) + 0.006
    return LatLng(tempLat, tempLon)
}

/**
 * BD-09(百度) -> GCJ-02(高德和腾讯)
 */
fun gcj02ToBd09(lat: Double, lng: Double): LatLng {
    val bd = LatLng(lat, lng)
    val x = bd.longitude - 0.0065
    val y = bd.latitude - 0.006
    val z = kotlin.math.sqrt(x * x + y * y) - 0.00002 * kotlin.math.sin(y * Math.PI)
    var theta = atan2(y, x) - 0.000003 * kotlin.math.cos(x * Math.PI)
    val bdLng = z * kotlin.math.cos(theta)
    val bdLat = z * kotlin.math.sin(theta)
    return LatLng(bdLat, bdLng)
}

二、跳转相应地图APP

2.1 跳转高德

/**
 * 打开高德地图
 * t = 0(驾车)= 1(公交)= 2(步行)= 3(骑行)= 4(火车)= 5(长途客车)
 */
private fun openGaoDeMap(context: Context, address: String?, latitude: String?, longitude: String?) {
    val intent = Intent().apply {
        action = Intent.ACTION_VIEW
        `package` = Constants.AMAP
        addCategory(Intent.CATEGORY_DEFAULT)
        data =
            "androidamap://route?sourceApplication=翎游&sname=我的位置&dlat=$latitude&dlon=$longitude&dname=$address&dev=0&m=0&t=0".toUri()
    }
    context.startActivity(intent)
}

2.2 跳转腾讯

/**
 * 打开腾讯地图
 *  公交:type=bus,policy有以下取值
 *  0:较快捷 、 1:少换乘 、 2:少步行 、 3:不坐地铁
 *  驾车:type=drive,policy有以下取值
 *  0:较快捷 、 1:无高速 、 2:距离短
 *  policy的取值缺省为0
 */
fun openTencentMap(context: Context, address: String?, latitude: String?, longitude: String?) {
    val intent = Intent().apply {
        action = Intent.ACTION_VIEW
        `package` = Constants.TENCENT
        data =
            ("qqmap://map/routeplan?type=drive&from=我的位置&fromcoord=0,0" +
                    "&to=$address&tocoord=$latitude,$longitude&policy=1&referer=myapp").toUri()
    }
    context.startActivity(intent)
}

2.3 跳转百度

/**
 * 打开百度地图
 * mode = transit(公交)、driving(驾车)、walking(步行)和riding(骑行). 默认:driving
 * 当 mode=transit 时 : sy = 0:推荐路线 、 2:少换乘 、 3:少步行 、 4:不坐地铁 、 5:时间短 、 6:地铁优先
 */
fun openBaiduMap(context: Context, address: String?, latitude: String?, longitude: String?) {
    if (StringUtils.isNumeric(latitude?:"") && StringUtils.isNumeric(longitude?:"")) {
        val latLng = gcj02ToBd09Batch(latitude!!.toDouble(), longitude!!.toDouble())
        val intent = Intent().apply {
            action = Intent.ACTION_VIEW
            `package` = Constants.BAIDU
            data =
                ("baidumap://map/direction?origin=我的位置&destination=name:$address" +
                        "|latlng:${latLng.latitude},${latLng.longitude}&mode=driving&sy=3&index=0&target=1").toUri()
        }
        context.startActivity(intent)
    } else {
        showToast(context, "缺少定位信息!")
    }
}

三、 高德、腾讯、百度地图调起API文档地址

百度地图:lbsyun.baidu.com/index.php?t…

高德地图:lbs.amap.com/api/amap-mo…

腾讯地图:lbs.qq.com/uri_v1/guid…