【问题标题】:Google maps android api won't work in release mode even though I specified package name and key's SHA-1 fingerprint in console即使我在控制台中指定了包名称和密钥的 SHA-1 指纹,Google maps android api 也无法在发布模式下工作
【发布时间】:2017-09-19 00:50:45
【问题描述】:

我知道这听起来像是一个重复的问题,但我现在正在寻找两天,但我一无所获。 我正在使用 Google maps android api v2,它在调试模式下运行良好。但是当我用释放密钥签名时,地图根本不会加载。 我所做的是:

1 - 我在 google 开发者控制台中创建了一个新项目

2 - 我启用了谷歌地图 api

3 - 我使用“凭据”菜单创建了一个新的 api 密钥

4 - 我使用我的 SIGNING KEY 的 SHA-1 指纹和包名称对其进行了限制(是的,我很确定它们是正确的)

5 - 我将它给我的密钥添加到我的清单文件中:

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

但它仍然只能在调试模式下工作(我添加调试 SHA-1 指纹的方式与我使用发布密钥的方式完全相同),而不是使用我的发布 apks

我什么都试过了:

  • 重新生成密钥

  • 正如一些人建议的那样,清单文件可以放在src/debug 中,我应该把密钥放在src/release 中。但是由于我使用的是最新版本的android studio,所以src中没有releasedebug文件夹

  • 我尝试在 Google 的开发者控制台中创建一个全新的项目,但没有成功

我真的不知道还能做什么。

有人给点建议吗?

ps:我没有收到任何关于密钥不正确或其他问题的错误;地图不仅会加载。即使是小谷歌标志也不会出现在地图底部

【问题讨论】:

  • 调试和发布是否使用相同的 API 密钥?还是您使用两个 API 密钥,一个用于调试,一个用于发布?
  • 我尝试了这两种方法,但都没有奏效。我的意思是,一旦我创建了一个 api 密钥,只添加了我的发布密钥签名,它就不起作用了。我还创建了另一个密钥并添加了发布和调试签名,但它仍然只能在调试模式下工作
  • 您是否将 API 密钥放入 google_maps_api.xml 文件中?还是直接放在manifest里面?
  • 我将它直接放在清单中,因为我以空白活动开始我的项目,没有创建 google_maps_api.xml 文件
  • 您是如何获得您的发布密钥的 SHA1 指纹的?

标签: android google-maps


【解决方案1】:

好吧,对于所有喜欢我的人,花了几天时间试图解决同样的问题,我终于找到了问题所在。

与我过去三天搜索的内容相反,它实际上可能是一个前卫问题。几乎所有互联网上的建议(以及谷歌自己的 api 文档)都告诉我,当你混淆你的发布 apk 时,谷歌的 api 不需要任何特殊的 proguard 规则。但事实证明(或至少在我的情况下),它剂量

这是我为解决问题而添加的 proguard 规则(这些规则的一个子集,既没有时间也没有动机在三天后对其进行测试):

#this alone won't slove the problem. but it is good to be here
-keep class com.google.android.gms.maps.** { *; }
-keep interface com.google.android.gms.maps.** { *; }

# I saw in their code that the api uses parcelables
-keepclassmembers class * implements android.os.Parcelable {
    static *** CREATOR;
}

# I added this because of a suggestion I found on the internet
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

#to be safe, don't dare touch the google apis at all
-keep class com.google.** {
  public protected private *;
}

【讨论】:

  • 一项崇高的努力,但这并不能解决我的问题。我可以完美地在调试模式下运行应用程序,但构建发布版本(然后手动安装)仍然无法正常工作,即使付出了巨大的努力。叹息。
【解决方案2】:

@roostaamir 它不适合我。最后我找到了解决方案,请点击下面的链接可能会有所帮助Google play app signing for this

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 2013-04-30
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多