Android打开第三方地图定位(百度,高德)

本文介绍了如何通过调用百度地图和高德地图的API实现从应用程序中启动地图并进行定位的功能。针对不同地图的特点,提供了具体的代码示例,并讨论了地理编码和逆地理编码API的选择及使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到一个需求,要打开手机里的第三方地图进行定位(只有地址信息,没有经纬度),网上查了一下,也查了相关Api,百度地图没啥说的,就照着官方文档来,so easy。高德就有点麻烦了,必须的传经纬度。下面就介绍一个百度和高德各自的调用

  1. 百度地图

    参考 官方API-2.2.4地址解析,这里就不做过多介绍,代码如下

    Intent().setData(Uri.parse("baidumap://map/geocoder?src=com.jianqi.wuye&address=${地址}"))
        .also {
            startActivity(it)
        }
    
  2. 高德地图

    官方Api–不管怎么样,肯定先要获取到地址的经纬度,刚开始我是用的地理编码求经纬度,刚开始我使用的是webApi地理编码,但是我发现这个api要必须要地址信息比较详细,否则获得经纬度偏差会比较大,导致定位不准确。后来我使用了搜索Api,这个api支持模糊搜索(关键字),返回的经纬度也是比较准确的,得到经纬度之后再根据经纬度进行定位,我用的是这个逆地理编码Api,经过几次试验之后,发现这个api最符合我的需求,总之拿到经纬度后一切都好办了。大家根据根据自己的需求选择不同的Api,下面是使用高德的部分代码

    /**
     * 是否安装了某个应用
     */
    fun Context.isAvaliable(packageName: String):Boolean{
        val installedPackages = packageManager.getInstalledPackages(0)// 获取所有已安装程序的包信息
        installedPackages.forEach {
            if (packageName == it.packageName){
                return true
            }
        }
        return false
    }
    val gaodeAvai = isAvaliable("com.autonavi.minimap")//是否安装了高德地图
    //先判断是否安装了高德
    if (gaodeAvai){
        httpUrlConnectionGet(address)
    }
    
    //申请key之后可能不会立即生效,我方式申请完之后测试老是提示key无效,第二天好了,哈哈
    private fun httpUrlConnectionGet(address: String){
        val GET_URL = "https://restapi.amap.com/v3//place/text?key=替换逆的key&output=JSON&keywords=${地址}"
        val okHttpClient = OkHttpClient()
        val request = Request.Builder().url(GET_URL)
            .build()
        val newCall = okHttpClient.newCall(request)
        newCall.enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                e.printStackTrace()
            }
            override fun onResponse(call: Call, response: Response) {
                response.body()?.let {
                    val string = it.string()
                    try {
                        val jsonObject = JSONObject(string)
                        val status = jsonObject.getString("status")
                        if ("1" == status) {
                            //请求成功
                            val jsonArray = jsonObject.getJSONArray("pois")
                            val geocodes = jsonArray.getJSONObject(0)
                            val location = geocodes.getString("location")
                            val split = location.split(",")
                            val intent = Intent(Intent.ACTION_VIEW)
                            intent.addCategory(Intent.CATEGORY_DEFAULT)
                            //逆地理编码,定位到地点
                           val uri =  Uri.parse("androidamap://viewReGeo?sourceApplication=${替换你的应用名称}&lat=${split[1]}&lon=${split[0]}&dev=0")
                             //val uri =  Uri.parse("androidamap://keywordNavi?sourceApplication=${替换你的应用名称}&keyword=${地址}")
                            intent.data = uri
                            startActivity(intent)
                        }
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }
            }
        })
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值