Flutter调用Google Maps报API密钥认证REQUEST_DENIED错误排查
Flutter调用Google Maps Platform报REQUEST_DENIED(未传API密钥)排查修复
以下是该错误的高频触发原因及对应修复方式,按排查优先级排序:
- AndroidManifest配置错误
首先核对配置文件里的密钥声明:- 标签层级错误:存放密钥的
<meta-data>标签必须是<application>标签的直接子节点,不能嵌套在<activity>、<provider>等其他标签内部 - name属性写错:新版Google Maps SDK对应的name属性固定为
com.google.android.geo.API_KEY,不少人会误写为旧版的com.google.android.maps.v2.API_KEY,会导致系统完全读取不到配置的密钥
正确配置示例如下:
<application android:label="你的Flutter应用名" android:icon="@mipmap/ic_launcher"> <!-- 其他已有应用配置 --> <meta-data android:name="com.google.android.geo.API_KEY" android:value="替换为你自己的GCP生成的API密钥"/> <!-- 后续Activity等配置 --> </application> - 标签层级错误:存放密钥的
- Web服务类接口未手动传参密钥
如果你不是通过google_maps_flutter官方插件调用原生地图能力,而是自行构造HTTP请求调用地点自动补全、路径规划、地理编码这类Web服务接口,写在AndroidManifest里的密钥不会自动附加到网络请求中,必须在请求的query参数中显式携带key=你的API密钥,漏传该参数就会直接触发你遇到的错误。
以地点自动补全接口为例,合法请求格式为:GET https://maps.googleapis.com/maps/api/place/autocomplete/json?input=关键词&key=你的API密钥 - GCP端密钥配置不匹配
- 未启用对应API:在GCP控制台的API库中,确认你给当前密钥开通了所有正在调用的API权限——比如调用地点自动补全需要单独启用Places API,仅启用Maps SDK for Android不会开放Web服务类接口的调用权限
- 应用限制不匹配:如果你的密钥设置了Android应用限制,需要确保配置的应用包名、SHA-1签名指纹和你当前运行环境完全匹配:调试运行时默认使用的是系统debug.keystore生成的SHA-1,打release包时需要替换为你自己正式签名文件的SHA-1,漏加调试签名的SHA-1是非常高频的踩坑点;如果密钥加了Android应用限制,就不能用这个密钥发起Web服务类的HTTP请求,限制类型必须和调用场景对应
- 结算账户状态异常:确认你绑定的结算账户没有过期、欠费,账户异常时即使密钥配置正确也会返回鉴权失败
- 构建缓存导致配置未生效
所有配置修改完成后,依次执行以下命令清理缓存,再卸载设备上已安装的旧版App重新编译:flutter clean flutter pub get
快速排查技巧:可以先把GCP里的API密钥临时改成「无应用限制」,跑通接口请求后再逐步加限制,能快速定位是不是限制规则配置错了导致的问题
内容的提问来源于stack exchange,提问作者osama
相关产品推荐
相关产品推荐

