Google Maps V2 无法使用正确的密钥进行生产

Posted

技术标签:

【中文标题】Google Maps V2 无法使用正确的密钥进行生产【英文标题】:Google Maps V2 not working in production with correct key 【发布时间】:2015-03-09 03:11:42 【问题描述】:

我在让 Google 地图在 android 应用中投入生产时遇到了很大的麻烦。这是我目前得到的(底部只是广告)。

我遵循的关键步骤:

1) 我已确保我已获得正确的 SHA1 生产密钥,并已在 Google 控制台 API 以及应用程序内实现它(它们是 google 提供的密钥)。我已经注册了两个密钥 - 一个用于调试,一个用于生产

2) 互联网、位置等工作正常

3) 该应用程序在调试模式下工作,但在通过 USB 签名并安装在设备上时无法工作。我已经三次检查了标志的 SHA 1 签名等。

4) MapsFragment 来自 Android Studio 中可用的模板。

在生产模式下,日志猫显示如下:

01-11 16:04:54.511  19346-19437/com.mike.mapstest E/Google Maps Android API﹕ Authorization failure.  Please see https://developers.google.com/maps/documentation/android/start for how to correctly set up the map.
01-11 16:04:54.516  19346-19437/com.mike.mapstest E/Google Maps Android API﹕ In the Google Developer Console (https://console.developers.google.com)
    Ensure that the "Google Maps Android API v2" is enabled.
    Ensure that the following Android Key exists:
    API Key: YOUR_KEY_HERE
    Android Application (<cert_fingerprint>;<package_name>): <SHA1 Removed for this> ;com.mike.mapstest

这个错误显然表明我的身份验证有问题? 我做错了什么?

【问题讨论】:

检查您的 SHA1 对于发布模式是否正确? @MohammodHossain,是的,我正在使用您通过签署生产应用程序获得的 SHA 密钥。 【参考方案1】:

基于您的可调试版本构建的 logcat 输出:

01-11 16:04:54.511  19346-19437/com.mike.mapstest E/Google Maps Android API﹕ Authorization failure.  Please see https://developers.google.com/maps/documentation/android/start for how to correctly set up the map.
01-11 16:04:54.516  19346-19437/com.mike.mapstest E/Google Maps Android API﹕ In the Google Developer Console (https://console.developers.google.com)
    Ensure that the "Google Maps Android API v2" is enabled.
    Ensure that the following Android Key exists:
    API Key: YOUR_KEY_HERE
    Android Application (<cert_fingerprint>;<package_name>): <SHA1 Removed for this> ;com.mike.mapstest

您似乎没有覆盖清单中的 api 密钥占位符 YOUR_KEY_HERE(或单独的 api 密钥文件,具体取决于您的配置)。用您的实际密钥替换该字符串,无论它位于何处,您应该一切顺利。

编辑:this tutorial,如果它与您的配置匹配,可能解释了为什么您只在发布版本中看到此内容:

返回 Android Studio 并将 API 密钥粘贴到文件的 YOUR_KEY_HERE 部分:

请注意,这些步骤已启用 Google 地图对应用程序包的调试版本的支持。当应用程序的发布版本准备好构建时,还需要将 API 密钥添加到位于 MapDemo -> app -> src -> release -> res -> values 的 google_maps_api.xml 文件中。

【讨论】:

谢谢@stkent。这就是问题所在。看来必须将 API 密钥硬编码到清单中,而不是使用来自外部 XML 文件的字符串资源。 完全相同的问题,这是修复。我再重复一遍:您必须在清单中硬编码 API 密钥! 这里有同样的问题,但没有硬编码解决它。尽管如此,当我写这篇评论时,Google 控制台上没有“Google Maps Android API v2”,只有“Google Maps Android API”。是一样的吗? 好的,我找到了解决方案。首先:必须对密钥进行硬编码其次:当我生成密钥时,我使用了 key;packagename 模板,Android 工作室在 google_maps_api.xml 的评论部分向我生成了什么。是的...包名称属于片段,而不是主要包。这杀死了一切,当我用清单中的那个切换它时,没关系。确保在生成 API 密钥@DroidWormNarendra 时使用 GoogleConsole 上的密钥;清单包模板 由于某种原因,从 cmets 中提供的链接生成 API 密钥不起作用(好吧,对我来说不是)。相反,从here 生成密钥确实如此。只需按照说明进行操作即可。【参考方案2】:

我也遇到了同样的问题,几天都在用头撞墙。我阅读了所有关于放置正确密钥的帖子。我一直在我的 google_maps_api.xml 文件中输入正确的密钥。上面提到的 StKent 确保用 AndroidManifest.xml 中的实际字符串覆盖。这就是为我解决的问题。

当它不起作用时我所拥有的: 在 AndroidManifest.xml 中:

<meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

在 google_maps_api.xml 中:

 <string name="google_maps_key"
        templateMergeStrategy="preserve"
        translatable="false">AIza_the actual key</string>

我为了让它工作而改变了什么 我将我的 AndroidManifest.xml 更改为包括:

<meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="AIzsa_the actual key" />

【讨论】:

是的,@StKent 是正确答案,需要对其进行硬编码。当我按照实际的正确文档进行操作时,这让我非常沮丧。 我在 manifest.xml 中为标记 com.google.android.geo.API_KEY 硬编码调试 API_KEY,但它仍然无法正常工作。仅供参考,昨天它工作正常,但突然停止显示地图图层,仅在底部|左显示 Google 图标【参考方案3】:

使用 Android Studio 生成 Google Maps Activity 时,它将忽略您的 gradle 构建配置并使用默认的 debug.keystoregoogle_maps_api.xml 中的 SHA1 基于此默认值。在 Google API 控制台中创建权限时,如果您使用的是非默认值,请确保使用您的生产和调试 SHA1。

【讨论】:

很高兴知道!我还没有使用过 Android Studio 地图活动生成器。 您回答的语言有些不清楚。应该使用哪个密钥库来生成要输入到 Google 控制台的 SHA-1 哈希? @TimBiegeleisen 这是很多版本以前的,所以它可能不再有效;但是,当使用 Android Studio 的函数生成 Google Maps Activity 时,它永远不会使用您的生产配置。在 Google 控制台中,如果您将其设置为用于生产,您应该使用 SHA1 用于生产密钥库。我建议您的 Google 控制台应该同时具有调试和生产功能,以便您的测试构建工作。【参考方案4】:

调试和生产密钥将不同。如果您使用调试键进行发布模式,则无法查看谷歌地图。对于发布模式,当您更改 google map key 时,您应该清理项目然后导出 apk。

您可以获得更多信息 https://developers.google.com/maps/documentation/android/start

从调试密钥存储中获取私有 SHA1

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass your_app_password

查看更多

SHA-1 fingerprint of keystore certificate

或者您可以使用 Eclipse 工具使用导出菜单生成私有 SHA1 密钥

【讨论】:

我正在使用通过密钥库签署应用程序以发布时找到的 SHA 密钥 好的。将您的 SHA1 密钥更改为公共调试密钥,然后查看您的谷歌地图。 公开调试密钥?这是 IDE 生成的密钥吗?在调试模式下使用调试键时,该应用程序可以工作。 我已经用密钥签署了应用程序,但处于调试模式(而不是发布)。这会在 AS 中生成“app-debug.apk”文件。这个 apk 确实有效。 对于发布模式,您需要私有地图 API 密钥。为此,您应该执行以下步骤。创建调试密钥存储然后 SHA1 然后谷歌地图 api 密钥【参考方案5】:

就我而言,我在 Google API 的 API 管理器 - 凭据 - “限制对您的 Android 应用程序的使用”中输入了错误的包名称。确保输入正确的包名称(如 AndroidManifest.xml 中)和正确的 SHA 指纹(用于调试和生产)。

【讨论】:

【参考方案6】:

已解决,我从 Google API 控制台中将“浏览器应用程序密钥(带引用者)”而不是“Android 应用程序密钥(带证书)”放在清单中

【讨论】:

【参考方案7】:

在我的例子中,灰屏是由 HostnameVerifier 的自定义实现引起的,它阻止了磁贴的加载。

希望这将在未来对其他人有所帮助。

【讨论】:

【参考方案8】:

error //确保“Google Maps Android API v2”已启用。 在这个你不能在谷歌云平台控制台中找到像谷歌地图 Android API v2。in this, give the exact Package Name: and signature of your project which is showing in run window or debug window , I faced the same problem because of changing MapActivity package location 我一整天都在努力寻找,所以请确保您是否更改了项目中的任何包,如果是这样,请提供显示在错误文本中的包 强调文字 确保存在以下 Android 密钥: API 密钥:YOUR_KEY_HERE Android 应用程序 (;):;com.mike.mapstest

【讨论】:

以上是关于Google Maps V2 无法使用正确的密钥进行生产的主要内容,如果未能解决你的问题,请参考以下文章

Android - Google Maps V2 无法使用 Fused Location

即使在 Flutter 中使用正确的 SHA1 密钥,Google 地图也无法在发布版本中工作

Google Maps Android API v2 授权失败

带有 API KEY 的 Google Maps V2 Android 显示为空白

Android - 上下文 - Google Maps V2 - 类型不匹配:无法从 Object 转换为 WindowManager

无法在发行版中激活 Google Maps API v2