一、检测是否安装相应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…