Google地图API问题:Release包中PlaceAutocompleteView自动关闭
我之前也碰到过一模一样的坑!这大概率是Release构建时API Key没有和签名密钥正确绑定导致的,下面给你拆解问题根源和具体解决办法:
问题根源分析
你提到Logcat里的API Key和Manifest配置的不一致,说明Release构建过程中,应用实际使用的是另一套Key(比如Debug环境的Key),而不是你为Release签名配置的专属Key。Google Maps/Places API的权限是和签名文件的SHA1强绑定的,Debug和Release签名的SHA1完全不同,一旦Key和SHA1不匹配,PlaceAutocomplete就会因为权限校验失败直接关闭。
具体解决方案
1. 确认Release签名的SHA1与API Key的绑定关系
首先确保你用对了Release签名的SHA1:
- 用命令行获取Release签名文件的SHA1:
(替换成你自己的keystore路径和别名)keytool -list -v -keystore your-release-keystore.jks -alias your-release-alias - 登录Google Cloud Console,检查这个SHA1是否已经关联到你的Release API Key,同时确认Places API已经启用(PlaceAutocomplete依赖这个API权限)。
2. 用Gradle动态注入API Key,避免硬编码混淆
硬编码API Key很容易在Debug/Release切换时出错,建议用构建变体动态配置:
- 在
app/build.gradle的buildTypes块中分别配置Debug和Release的API Key:android { buildTypes { debug { resValue "string", "google_maps_api_key", "你的Debug环境API Key" } release { resValue "string", "google_maps_api_key", "你的Release环境API Key" } } } - 然后在
AndroidManifest.xml中引用这个字符串资源:
这样Debug和Release构建时会自动加载对应环境的Key,彻底避免混淆。<meta-data android:name="com.google.android.geo.API_KEY" android:value="@string/google_maps_api_key" />
3. 检查Release构建的混淆规则
如果你的Release包开启了代码混淆,可能会把Google Places的核心类给混淆掉,导致功能异常。在proguard-rules.pro中添加以下规则:
-keep class com.google.android.gms.places.** { *; } -keep class com.google.android.gms.location.** { *; } -keep interface com.google.android.gms.common.api.GoogleApiClient$ConnectionCallbacks { *; }
4. 验证构建后的Manifest内容
有时候构建工具会自动修改Manifest,你可以查看Release构建后的最终Manifest文件(路径:app/build/intermediates/manifests/full/release/AndroidManifest.xml),确认里面的API Key是否是你配置的Release Key。
最后总结
核心就是确保Release签名的SHA1和对应的API Key正确绑定,同时通过Gradle动态注入Key的方式,避免Debug和Release环境的Key搞混。按照上面的步骤排查,应该就能解决PlaceAutocomplete自动关闭的问题了。
内容的提问来源于stack exchange,提问作者Karanjeet Singh

