Flutter集成Google Maps遇400错误:指定URL请求异常
Flutter集成Google Maps出现400错误的解决方案
你遇到的E/Volley (21144): [88] cx.a: Unexpected response code 400 for https://clients.google.com/glm/map/api错误,并非来自你代码中调用的Place API请求,而是Google Maps Flutter插件内部发起的请求,核心问题基本出在API密钥配置或服务启用环节,以下是具体排查和解决步骤:
1. 检查API密钥对应的服务启用状态
- 登录Google Cloud控制台,确认你的API密钥已启用以下服务:
- Maps SDK for Android(iOS项目需额外启用Maps SDK for iOS)
- Places API(你代码中用到的地点搜索服务)
- 很多开发者会遗漏启用地图SDK,这是导致插件内部请求失败的常见原因。
2. 验证API密钥的应用限制配置
- 若你给API密钥设置了应用限制(如SHA-1指纹+包名),需核对:
- SHA-1指纹是否正确:Debug环境下可通过命令
keytool -list -v -keystore ~/.android/debug.keystore获取(默认密码为android),Release环境需用对应签名文件的指纹。 - Android包名是否匹配:查看
android/app/build.gradle中的applicationId字段,确保和控制台配置的包名完全一致。
- SHA-1指纹是否正确:Debug环境下可通过命令
- 测试阶段可暂时移除应用限制(设置为“无限制”),若错误消失,说明是限制配置有误。
3. 排查Place API请求失败的问题
你注释的判断逻辑抛出异常,说明Place API未返回有效数据,可通过以下方式排查:
- 确认
KEY_HERE已替换为正确的API密钥。 - 在浏览器中直接访问你代码中的Place API URL,查看返回的错误信息(如API未启用、密钥无效、配额耗尽等),这能快速定位问题。
- 给输入参数做URL编码,避免特殊字符破坏请求格式,修正后的请求URL示例:
final String url = 'https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=${Uri.encodeComponent(input)}&inputtype=textquery&key=$key'; - 添加错误处理逻辑,打印响应体辅助排查:
Future<String> getPlaceId(String input) async { final String url = 'https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=${Uri.encodeComponent(input)}&inputtype=textquery&key=$key'; var response = await http.get(Uri.parse(url)); print('Place API响应内容: ${response.body}'); var json = convert.jsonDecode(response.body); if (json.containsKey('error_message')) { throw Exception(json['error_message']); } if (json['candidates'].isEmpty) { throw Exception('未找到匹配地点: $input'); } var placeId = json['candidates'][0]['place_id'] as String; return placeId; }
4. 确认Google Cloud项目的配额与账单状态
- 检查项目是否绑定了有效的账单信息,未绑定账单或账单异常会导致API请求被拒绝。
- 查看Place API和Maps SDK的配额是否超出限制,可在Cloud控制台的“API和服务-配额”页面查看。
内容的提问来源于stack exchange,提问作者Tyrone
相关产品推荐
相关产品推荐

