You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android调用Geocoding API反向解析地址出现REQUEST_DENIED错误如何解决

问题原因

你当前的API密钥在Google Cloud控制台配置的是Android应用类型的访问限制,该限制仅对Google Maps Android SDK等官方移动端SDK生效,这类SDK会自动在请求中携带应用包名、SHA1签名信息完成身份校验。而你通过Retrofit直接调用Geocoding的Web服务接口时,请求不会自动携带校验信息,因此触发了权限校验失败,返回REQUEST_DENIED错误。另外也请确认你已经在Google Cloud控制台单独启用了Geocoding API,地图SDK启用不代表Geocoding API默认开启。

解决方案

可根据你的使用场景选择以下任意一种方案:

  • 方案1:改用Android官方自带的Geocoder类完成逆地理编码
    该能力属于Google Maps Android SDK的内置功能,可共用当前已配置的API密钥和Android应用限制,不需要自行发起HTTP请求,示例代码如下:
    val geocoder = Geocoder(context)
    // 高版本Android异步调用
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        geocoder.getFromLocation(35.6731433, 51.4204595, 1) { addresses ->
            if (addresses.isNotEmpty()) {
                val formattedAddress = addresses[0].getAddressLine(0)
                // 处理返回的地址信息
            }
        }
    } else {
        // 低版本Android兼容调用
        @Suppress("DEPRECATION")
        val addresses = geocoder.getFromLocation(35.6731433, 51.4204595, 1)
        if (!addresses.isNullOrEmpty()) {
            val formattedAddress = addresses[0].getAddressLine(0)
            // 处理返回的地址信息
        }
    }
    
  • 方案2:给HTTP请求补充校验Header
    如果一定要通过Retrofit直接调用Geocoding API,需要在请求头中添加两个参数:
    • X-Android-Package:填写你的应用包名
    • X-Android-Cert:填写你的应用签名SHA1值(去掉所有冒号,全部转为大写)
      同时确认Google Cloud控制台的API密钥配置页中,已经给该密钥添加了Geocoding API的调用权限。
  • 方案3:调整API密钥限制类型
    如果是服务端测试场景,可将API密钥的限制类型从「Android应用」调整为「IP地址限制」,添加报错信息中提示的IP地址62.212.239.62即可正常调用。该方案不适合端侧用户使用,因为普通用户的IP地址不固定。

安全提示

不建议直接在客户端代码中硬编码API密钥,存在被盗用的风险。生产环境建议将Geocoding请求转发到你的后端服务处理,API密钥仅保存在后端,可有效避免密钥泄露。


内容的提问来源于stack exchange,提问作者mehdi dorreh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:27:02