Android:谷歌地图v2没有显示发布地图apk

时间:2014-11-06 11:47:25

标签: android api google-maps keystore sha1

我的谷歌地图应用程序在使用调试谷歌地图API KEY的设备上工作正常,但当我使用发布谷歌地图API KEY为我的应用程序创建签名的apk时,它不显示地图。 要生成发布模式google API KEY,我在我的密钥库中使用SHA1指纹。 我还在我的项目设置中定义了“签名和构建类型”,如developer.android.com(http://developer.android.com/tools/publishing/app-signing.html)所述。

尝试了所有可能的解决方案(删除apk,然后再重新安装,重新启动设备,清理项目)。没有用。 任何人都有一个很好的解决方案,我的问题请帮忙。 仅供参考使用Android工作室平台。

16 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:14)

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

答案 2 :(得分:6)

调试证书与您的生产证书不同。您需要将两者添加到API控制台中的Google Maps键条目作为seaparate行 - 每个行具有相同的packageId,但自然不同的SHA1哈希值。

修改

对单个Google地图密钥分配了多少证书指纹和软件包名称没有限制,因此除非您需要将其分开,否则完全可以使用相同的密钥进行开发和生产构建。在Google控制台中,它就像这样(一个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

答案 3 :(得分:3)

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

对于Android Studio:

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

答案 4 :(得分:2)

很抱歉回复很晚。希望这有助于未来。 我使用这个解决方案来解决同样的问题 当我们在开发时使用Google地图时,会使用默认的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中为新的SHA1创建新的API项目的API密钥,用于在第2点中检索的新SHA1 4)在清单文件中使用该API密钥,如下所示     

5)根据点1)清理你的项目并再次构建APK文件 6)你现在可以在那个apk中看到谷歌地图。

答案 5 :(得分:2)

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

  1. Debug Build Variant

    • 使用keytool生成新的android调试密钥
    • 将此密钥(SHA-1)与google console上的android map api密钥相关联
    • 调试模式有一个google_maps_api.xml,其中android maps api键存储为(src / debug /.../ google_maps_api.xml)字符串" google_maps_key"
  2. 发布构建变体

    • 使用keytool生成新的Android释放密钥
    • 在Google控制台上使用新的Android地图api密钥协调此密钥(SHA-1)
    • 发布模式有一个google_maps_api.xml,其中发布的android映射api键存储为(src / release /.../ google_maps_api.xml)字符串" google_maps_key"。
  3. 在AndroidManifest.xml中添加以下行:

    bpl

    按照正常的调试和发布程序进行操作。它应该无缝地工作。

答案 6 :(得分:1)

create another Maps API key (to put in your manifest) corresponding with you release   
keystore for release.

check Google's documentation

答案 7 :(得分:1)

你不能使用你在发行版中调试中使用的相同密钥,它们有不同的作品。 要解决此问题,您必须从您在发布副本中使用的密钥库中生成新的Google地图密钥API KEY 有关详细信息,请参阅此视频 https://www.youtube.com/watch?v=xLJ0jDFdUZ0

答案 8 :(得分:1)

对于期货参考---我的情况---有两个google_maps_api.xml文件,你需要把你的谷歌API密钥。你可以很容易地在其中一个中替换YOUR_API_KEY(特别是如果你刚刚删除了google api / app并创建了新的那个)

答案 9 :(得分:1)

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

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

  1. 使用以下命令

    获取调试的SHA1
    keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
    
  2. 要获取释放SHA1,命令将更改为

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

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

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

    password是签署apk时使用的密码

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

答案 10 :(得分:1)

如何获取发布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>

然后,只需按照这些说明操作,在Developer Console中创建一个新条目。

  • 如果您在看到日志之前点击了应用地图,则可能需要从内存中关闭应用并再试一次)
  • 此过程也适用于模拟器。

答案 11 :(得分:0)

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

在此之前,您需要清晰的应用数据(设置 - &gt;应用选择应用 - 清除数据 - >卸载)并尝试。这对我有用。 确保程序包名称与google developer Console中的程序包名称相同。

答案 12 :(得分:0)

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

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

enter image description here

答案 13 :(得分:0)

我遇到了类似的问题:在创建了几个具有相同类型(“发布”)的新变体版本但是一些新版本(“免费”和“高级版”)之后,Google Maps片段不再显示地图和屏幕显得空白。在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“。

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

因此解决方案是在同一个Project Credentials中添加两个新的变体条目以继承相同的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文件

答案 14 :(得分:0)

以下方法对我有用:

  • 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

答案 15 :(得分:0)

Google密钥具有两种安全性。

1。非受限键
2.Restricted key(Android受SHA-1限制)

注意:“限制”键用于“地图”,“地方”,而不用于Google路线。对Google路线使用非受限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(左侧窗格中的“渐变”选项卡,然后选择“签名报告”),并在Google Developer Console中为您使用的Api密钥添加为项。

  • 步骤-3:一旦您生成了Signed Apk,Google就会使用Google自己的SHA-1密钥覆盖您的Androidstudio生成的SHA-1 a。因此您还需要在开发者控制台的Api密钥中添加Api密钥

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

    复制SHA-1证书指纹

    将此新复制的SHA-1指纹粘贴到开发人员控制台,并显示发布模式下的地图。

  • 第4步:还将发布版本SHA-1也添加到开发者控制台中的Api密钥,如下所示。

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

    复制SHA-1证书指纹

    将此新复制的SHA-1指纹粘贴到开发人员控制台,并显示发布模式下的地图。