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
相关产品推荐
相关产品推荐

