Android:Google Map v2 未显示发布 apk 的地图

Posted

技术标签:

【中文标题】Android:Google Map v2 未显示发布 apk 的地图【英文标题】:Android: Google Map v2 not showing map for release apk 【发布时间】:2015-01-02 21:57:24 【问题描述】:

我的谷歌地图应用程序在使用调试谷歌地图 API KEY 的设备上运行良好,但是当我使用发布谷歌地图 API 密钥为我的应用程序创建签名 apk 时,它不显示地图。 要生成发布模式 google API KEY ,我将 SHA1 指纹与我的密钥库一起使用。 而且我还在我的项目设置中定义“签名和构建类型”,正如 developer.android.com(http://developer.android.com/tools/publishing/app-signing.html) 所解释的那样。

尝试了所有可能的解决方案(删除 apk 并重新安装它,重新启动设备,清理项目)。没有任何效果。 任何人都可以很好地解决我的问题,请帮助。 仅供参考,使用 android studios 平台。

【问题讨论】:

可以使用SHA1的keyStore创建map api key 你能附上你的API控制台的截图吗? 您可以使用同一个 Google API 密钥来调试和释放指纹。 我遇到了同样的问题,我的情况是它添加了 apikey 到 debug>res>values>google_maps_api.xml 但忘记了添加 release>res>values>google_maps_api.xml 。现在它工作正常跨度> 感谢您放置文件路径 --- 这清楚地说明了情况 ---- 如果站在我面前,我现在会吻你。我花了这么多时间才找到这个该死的答案。 【参考方案1】:

也许您有两个 google_maps_api.xml 文件,一个在 app/src/debug/res/values 文件夹中,另一个在 app/src/release/res/values 文件夹中,但只有调试文件包含您的 API 密钥.

【讨论】:

谢谢,这是我的问题!确保切换到“项目”结构以查看层次结构。 这是真的,但请务必注明此答案的原作者:***.com/a/27068196/2249692 我的项目没有 app/src/debug/res/ 或 app/src/release/res。我如何得到它或我必须创建它?请回复我 这就是问题所在。感谢您的回答【参考方案2】:

API 密钥需要硬编码到 Android Manifest 中,如果它位于单独的资源 XML 文件中,则它不起作用。

【讨论】:

这并不能真正回答问题。如果您有其他问题,可以点击 提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 也许我的英语不好是问题所在。我遇到了同样的问题,我通过将 API 密钥从单独的资源 XML 文件移动到 Android Manifest 来解决它。我不知道为什么它确实可以在调试而不是使用签名的 APK,但由于我所做的唯一更改是移动 API 密钥,它是我的解决方案。 伙计,你真的挽救了我的理智。我在这个问题上苦苦挣扎了几天,从来没有想过这个:android studio 在使用地图向导时为密钥创建了一个单独的资源文件,我认为它是正确的。谢谢一百万! 我有同样的问题,我的密钥也在清单中,但是当我生成 singed apk 时 ap 显示空白。 这真的拯救了我的一天!应该被选为经过验证的答案!【参考方案3】:

调试证书与您的生产证书不同。您需要将 both 作为单独的行添加到 API 控制台中的 Google Maps 密钥条目中 - 每个都具有相同的 packageId,但自然是不同的 SHA1 哈希。

编辑

没有限制分配给单个 Google Maps 密钥的证书指纹和包名称的数量,因此除非您需要这种分离,否则开发和生产版本都可以使用相同的密钥。在谷歌控制台中是这样的(一个 sha1 来自调试证书,对于您使用此 IDE 构建的所有应用程序都是一样的,另一个是生产证书):

83:10:58:52:EF:3B:59:70:2B:28:9E:AE:4F:5E:1D:F0:7E:19:FB:F1;com.foo.bar
AE:4F:5E:1D:F0:7E:19:FB:83:10:58:52:EF:3B:59:70:2B:28:9E:AA;com.foo.bar

甚至(但我不建议对不同的应用使用相同的密钥):

83:10:58:52:EF:3B:59:70:2B:28:9E:AE:4F:5E:1D:F0:7E:19:FB:F1;com.foobar.myapp
AE:4F:5E:1D:F0:7E:19:FB:83:10:58:52:EF:3B:59:70:2B:28:9E:AA;com.foo.bar
EF:3B:59:7E:19:FB:83:10:58:57:AE:4F:5E:1D:F0:2B:28:DE:9E:01;net.something.otherapp

【讨论】:

当然,对于发布模式,我们需要不同的 SHA1。我之前生成了两个单独的谷歌地图密钥。尝试了将两个证书保存在同一个 Map Key 中的方法,但没有运气。在这里尝试了所有解释(developers.google.com/maps/documentation/android/…)。带有调试证书的应用程序可以正常工作,但是当切换到发布模式时,它不显示地图。在生成 APK 文件时,我是否在 android 工作室中遗漏了一些东西。谢谢。 @marcin-orlowski 是正确的。只要您将发布密钥指纹添加到“允许的 Android 应用程序”中,并在末尾用分号分隔软件包名称,那么您的发布 APK 也应该显示地图。我在这里写了一篇更详细的帖子***.com/questions/27351357/…【参考方案4】:

我遇到了这个问题并运行了这些步骤,我认为这种方式是完美且完整的

对于 Android Studio:

    构建-生成签名 APK 复制密钥存储路径。 现在打开命令提示符并转到 C:\Program Files\Java\jdk1.6.0_39\bin>(或任何已安装的 jdk 版本)。 键入 keytool -list -v -keystore 然后粘贴您的密钥存储路径(例如 C:\Program Files\Java\jdk1.6.0_39\bin>keytool -list -v -keystore " E:\My Projects\Android\android studio\signed apks\Hello World\HelloWorld.jks")。 现在它将询问密钥存储密码,提供您的密码并按 Enter 以获取您的 SHA1 和 MD5 证书密钥。 您可以看到 SHA1 用于您的调试证书并在 Google Developer 中使用 控制台

【讨论】:

请观看此视频如何为发布创建 SHA1 youtu.be/g75cZXjmuj8【参考方案5】:

抱歉回复晚了。希望这对未来有所帮助。 我用这个解决方案来解决同样的问题 当我们在开发过程中使用谷歌地图时,使用了一个默认的 debug.keystore,它没有密码。当我们构建要上传到 Play 商店的 apk 文件时,会生成新的 SHA-1 密钥,因此我们必须为此创建新的 debug.keystore。我们必须为该 SHA-1 创建新的 API 密钥。 根据解决方案How to obtain Signing certificate fingerprint (SHA1) for OAuth 2.0 on Android?,我们可以得到导出的apk文件的SHA-1。

之后使用 Android Manifest 中的新 API 密钥作为前一个密钥,您就完成了。

编辑 1-执行此操作的步骤 1) 使用项目“Android Manifest”文件中的“使用导出向导”创建 apk 文件。 2) 插入密钥后,完成前,MD5 和 SHA1 密钥如图所示是这个给定的图片- (http://i.stack.imgur.com/SldEv.png) 3) 在https://console.developers.google.com 中为第 2 点中检索到的新 SHA1 创建新的 Android 项目 API 密钥。 4)在清单文件中使用该 API 密钥,如下所示

5)按照第 1) 点清理您的项目并再次构建 APK 文件。 6) 您现在可以在该 apk 中查看谷歌地图。

【讨论】:

非常感谢。你救了我【参考方案6】:

有两件事要记住并让它发挥作用。

    调试构建变体

    使用 keytool 生成新的 android 调试密钥 将此密钥 (SHA-1) 与谷歌控制台上的 android map api 密钥相关联 调试模式有一个 google_maps_api.xml,其中以字符串“google_maps_key”的形式存储了 android maps api 密钥 (src/debug/.../google_maps_api.xml)

    发布构建变体

    使用 keytool 生成新的 android 发布密钥 将此密钥 (SHA-1) 与谷歌控制台上的新 android map api 密钥相关联 发布模式有一个 google_maps_api.xml,其中以字符串“google_maps_key”的形式存储了发布 android maps api 密钥 (src/release/.../google_maps_api.xml)。

在 AndroidManifest.xml 中添加以下行:

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

按照正常程序进行调试和发布。它应该可以无缝运行。

【讨论】:

【参考方案7】:
create another Maps API key (to put in your manifest) corresponding with you release   
keystore for release.

check Google's documentation

【讨论】:

我已经这样做了,但还是一样(在我的帖子中已经提到过)。【参考方案8】:

您不能使用与发布中调试时使用的相同的密钥,它们有不同的工作方式。 要解决此问题,您必须从您在发布副本中使用的密钥库生成新的 Google 地图密钥 API KEY 看到这个视频了解更多详情 https://www.youtube.com/watch?v=xLJ0jDFdUZ0

【讨论】:

【参考方案9】:

对于期货参考——我的情况——有两个 google_maps_api.xml 文件,您需要在其中放置您的 google api 密钥。您很容易犯错误,只在其中一个中替换 YOUR_API_KEY(尤其是如果您刚刚删除了 google api/app 并创建了新的)

【讨论】:

是的,这就是我的情况。我已将 SHA-1 添加到开发人员控制台,但仍然无法正常工作。直到看到这篇文章并意识到有两个 google_maps_api.xml,一个在 debug/res/values 下,一个在 release/res/values 下。【参考方案10】:

在我们创建 API KEY 的 Google Api 控制台中,我们可以选择将多个指纹添加到同一个密钥。我所做的是为我的调试密钥库和发布密钥库添加两个 SHA1 指纹,并且相同的 API 密钥对我有用。

请注意,以下内容专门针对 Ubuntu:

    使用以下命令获取 SHA1 以进行调试

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

    为了获取 SHA1 以释放,命令更改为

    keytool -list -v -keystore /home/atul/Desktop/Learnings/Projects/TestApp/keystore.jks -alias test -storepass password -keypass password
    

在哪里

/home/atul/Desktop/Learnings/Projects/TestApp/keystore.jks 是我的签名 apk 的密钥库文件所在的路径

test 是生成签名密钥库时使用的密钥别名

password 是签名 apk 时使用的密码

希望这会有所帮助。快乐编码:)

【讨论】:

【参考方案11】:

我遇到了类似的问题,问题是我从 Android Studio 生成了 apk,而没有先选择正确的风格。这意味着我的清单仍在使用我为调试风格创建的 Google Maps API 密钥。

请确保在您的 Android Studio 中选择发布风格。请看下面的截图:

【讨论】:

【参考方案12】:

如何获取release api SHA1指纹:

从 Playstore 安装您签名的 APK,或者只是将其复制到手机上。

如果是真机,插上USB线,打开Android Studio。

第一次尝试获取地图时,日志条目将显示如下内容:

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: AIzaS<YOUR KEY YOUR KEY YOUR KEY YOUR KEY>

Android Application (<cert_fingerprint>;<package_name>): 56:AF:B2:<THIS IS WHAT YOU ARE LOOKING FOR>;br.com.tinx.<your package>

然后,只需按照这些说明,在开发者控制台中创建一个新条目。

如果您在查看日志之前点击了应用地图,则可能需要从内存中关闭应用并重试)​​ 这个过程也应该在模拟器上运行。

【讨论】:

【参考方案13】:

如果您是从自定义密钥库创建的 SHA1 代码,请在发布模式下使用相同的代码。或通过使用相同的密钥库签名并测试来生成 apk。

在此之前,您需要清除应用数据(设置->应用-选择应用-清除数据->卸载)并尝试。这对我有用。 确保包名称与谷歌开发者控制台中的相同。

【讨论】:

【参考方案14】:

我遇到了类似的问题:在创建了几个具有相同类型(“发布”)但有一些新风格(“免费”和“高级”)的新变体构建后,Google 地图片段不再显示地图和屏幕显得完全空白。在 logcat 中,我只能看到下一条错误消息“https://clients4.google.com/glm/mmap/api 的意外响应代码 400”,这可能表明 Google Maps API 访问存在问题。

当然,我再次查看了所有 Google Cloud API 流程,以检查我的 API 密钥凭据中是否缺少某些内容,但我没有发现任何错误。事实上,对于新的 APK,建议将构建信息(名称+指纹)添加到现有的项目凭据中,以便继承仍然有效的相同 API 密钥。

我们可以阅读的说明非常清楚:“添加您的包名称和 SHA-1 签名证书指纹以限制对您的 Android 应用程序的使用。从您的 AndroidManifest.xml 文件中获取包名称。然后使用以下命令获取指纹:keytool -list -v -keystore mystore.keystore”。

我的问题是我的新变体“包名称”不是清单包名称(“com.example.app_name.release”)中存在的那个。事实上,由于我的新口味,我有相同的清单名称,但有两个新的“真实”包名称:“com.example.app_name.free.release”和“com.example.app_name.premium.release”。这些名称不会出现在 Manifest 文件中,因为它们对应于定义风味的 Gradle 配置(在我的例子中是“applicationIdSuffix”属性)。这让我很困惑,因为 Gradle“应用程序 ID”不应该与清单“包名称”重叠。但是当我们仔细阅读所有Android文档时,我们可以看到“如果清单包名称与Gradle applicationId不同,则构建将复制最终清单文件中的应用程序ID”。当然,这两个变体具有相同的指纹,因为它们仍然具有相同的构建类型(“发布”)。

因此解决方案是在相同的项目凭据中添加两个新的变体条目以继承相同的 API 密钥:

原始条目(无需删除):包名 = "com.example.app_name.release" - SHA-1 证书指纹 = "xxxxx"

新条目 1:包名称 = "com.example.app_name.free.release" - SHA-1 证书指纹 = "xxxxx" 无变化,与现在使用的相同

新条目 2:包名称 = "com.example.app_name.premium.release" - SHA-1 证书指纹 = "xxxxx" 无变化,与现在使用的相同

最后,可能需要清理您的构建,以确保您在地图片段或活动中真正看到正确的更新行为。

关于其余的建议,就我而言,我不必应用它们: - 无需在 Manifest 中硬编码 API 密钥 - 无需为新的变体 APK 创建新的 API 密钥 - 无需使用 google_maps_api.xml 文件

【讨论】:

【参考方案15】:

以下方法对我有用:

google maps api key 作为@Florence Herrou 提及的硬编码文本放入清单中

Android Studio 在里面创建:

app\src\debug\res\values\google_maps_api.xml (debug) //add key here

在里面添加键 ->

app\src\release\res\values\google_maps_api.xml (release) //add key here

【讨论】:

【参考方案16】:

Google 密钥有两种安全性。

1.非限制键 2.Restricted key(Android通过SHA-1限制)

注意:地图、地点使用受限键,但 Google 路线不使用。对 google Directions 使用不受限制的 api 密钥。 bcz 其基于 Web 的 api 响应,因此受限密钥不起作用。

-> 使用非限制键时

查看两个 google_maps_api.xml 文件,一个在 app/src/debug/res/values 文件夹中,另一个在 app/src/release/res/values 文件夹中,但只有调试文件包含您的 API 密钥。确保两个文件中的密钥相同。

-> 使用受限 (Android SHA-1) 密钥时

第 1 步:查看两个 google_maps_api.xml 文件,一个在 app/src/debug/res/values 文件夹中,另一个在 app/src/release/res/values 文件夹中,但只有调试文件包含您的 API 密钥。确保两个文件中的密钥相同。

第 2 步:使用 AndroidStudio 生成 SHA-1(左窗格中的 gradle 选项卡并选择签名报告),并在 Google 开发人员控制台中为您使用的 Api 密钥添加一个项目。

步骤 - 3:一旦您生成 Signed Apk,谷歌将使用谷歌自己的 SHA-1 密钥覆盖您的 Androidstudio 生成的 SHA-1 a。所以你还需要在开发者控制台的 Api 键中添加 Api 键

转到发布管理 -> 应用签名 -> 并从 应用签名证书

复制 SHA-1 证书指纹

将这个新复制的 SHA-1 指纹粘贴到开发者控制台,发布模式下的地图就会显示出来。

第 4 步:将 Release build SHA-1 也添加到开发人员控制台中的 Api 密钥,如下所示。

转到发布管理 -> 应用签名 -> 并从 上传证书

复制 SHA-1 证书指纹

将这个新复制的 SHA-1 指纹粘贴到开发者控制台,发布模式下的地图就会显示出来。

【讨论】:

以上是关于Android:Google Map v2 未显示发布 apk 的地图的主要内容,如果未能解决你的问题,请参考以下文章

Google Map Android API V2 中两个位置之间的旅行时间

在android google map v2中使标记只能点击一次

(Android) 使用地图标记创建边界框并在 Google Map V2 中获取其宽度

如何设置 Android Google Maps API v2 地图以显示全球地图?

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

捕获 Google Map Android API V2 的屏幕截图