【问题标题】:Google Places for Android API key does not work on app from Play StoreGoogle Places for Android API 密钥不适用于 Play 商店中的应用
【发布时间】:2018-12-12 01:13:25
【问题描述】:

我最近launched an Android app 使用了 Google Places 自动完成小部件/API。作为配置的一部分,我将 API 密钥添加到我的 Android 清单文件中:

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

此外,在 Google Developers 控制台中,我仅为 Android 设备启用了此 API 密钥,但不限于任何特定 API。我还为我的应用程序输入了正确的包名称和 SHA-1 哈希。现在我有以下问题:

  • 当我直接从 Android Studio 将应用程序部署到 Android 手机上时,Google API 都可以正常工作。无论我使用调试模式还是发布模式变体都是如此。
  • 当我从完全相同的代码将 APK 发布到 Play 商店,然后安装该应用程序时,除了 Google 自动完成 API 损坏之外,一切正常。尝试访问时,它会立即关闭。

我确信我部署到 Play 商店的实际上是在本地运行的同一个应用程序,因为我最近还做了一些小的 UI 补丁,这些补丁也出现在商店版本中。我多次验证了正确的密钥是清单文件中显示的内容。

我无法解释这一点。这个问题特别困难,因为一切都可以在 Android Studio 中运行,所以我无法执行诸如进入调试并尝试捕获异常之类的操作。

如果您对 Android 和自动完成有一定的专业知识,并且遇到过类似的问题,那么我欢迎您的回答。

【问题讨论】:

  • 你的项目中添加了 proguard 吗?
  • 检查日志/错误日志。如果有任何配置问题,肯定会生成日志。
  • @Sahil 我不确定。 proguard 会影响发布行为吗?
  • @Killer 我不知道在发布模式下构建。我只验证了我猜是在调试模式下。我会尝试您的建议,然后查找错误。感谢您提供帮助。
  • @Killer 我已经在调试模式下从 Android Studio 发布版本到我的测试手机上运行了有问题的活动。但是,令我惊讶的是,Google Places 自动完成小部件实际上正在工作。现在我不知道为什么从应用商店下载的版本失败了。

标签: android api-key googleplacesautocomplete


【解决方案1】:

您有问题的声明 ===>我还为我的应用输入了正确的包名称和 SHA-1 哈希

问题:实际上到目前为止,您只需使用 上传密钥 为您的应用程序签名,但对于 Play 商店,您需要 google created SHA-1

这里有更详细的解释

Google Play 应用签名的工作原理。[Document Link]

第 1 步:创建上传密钥

第 2 步:准备发布

第 3 步:上传您签名的应用

第 4 步:向 API 提供商注册您的应用签名密钥

在应用交付给用户之前,Google Play 将删除您的上传密钥签名并使用新密钥重新签名。

这意味着您使用上传密钥为您的应用签名。然后,Google 会验证并删除上传密钥签名。最后,Google 会使用您提供的原始应用签名密钥对应用重新签名,并将您的应用交付给用户。

因此,为了解决您的问题,您需要在将应用上传到 Google Play 并且应用已提交并获得批准后执行这些额外步骤

  1. 从 Google Play 控制台中选择您的应用,转到开发工具 -> 发布管理 -> 应用签名。

  2. 上传应用后复制 Google Play 颁发的第一个 SHA-1 证书。

  3. 转到 Google 控制台并转到您的项目。

  4. 选择您的 API 密钥,并将 SHA-1 粘贴到包名称之后。

【讨论】:

  • 您引用的文档说 Google Play 使用 new 键进行签名,不是您提供的那个。但是,除此之外,您的答案最接近解决问题。顺便说一句,按照您的步骤操作。
  • 谢谢。我试图以简洁的方式解释它。但是我提到的声明在应用程序交付给用户之前,Google Play 将删除您的上传密钥签名并使用新密钥重新签名. 澄清您拥有的 key 将一直有效,直到在 Play-store 上发布。
  • 非常感谢,为此苦苦挣扎了好几天。先生,您拯救了这一天:D
  • 这里你在解释发布的seteps,在将应用上传到Play商店之前的调试呢!?
  • 请注意,在新的 Google Play 控制台上,他们更改了 SHA 密钥的位置。它现在处于发布/设置/应用完整性下
【解决方案2】:

@NullPointer 的答案在功能上是正确的,并且确实解决了我的问题。但为了更直接地回答我自己的问题,问题的根本原因与为 Android 应用的本地调试版本和同一应用的发布版本配置 Google API 的过程大不相同。

这里的部分混乱与 Google 控制台本身有关:

然后使用以下命令获取(SHA-1)指纹:

keytool -list -v -keystore mystore.keystore

在本地构建和测试应用程序时,在调试模式下,实际上是针对调试密钥库文件运行keytool,并将 SHA-1 哈希粘贴到 Google 控制台中,这样 API 就可以工作了。在代码库上呆了几个月或更长时间,并且 API 看起来非常稳定之后,当使用发布 APK 重复这些步骤时,接下来会发生什么令人惊讶。

这是一个惊喜,因为执行相同的步骤不适用于发布应用程序。这是因为 Google Play 商店实际上使用不同的密钥为您的 APK 签名,因此该密钥具有不同的 SHA-1 哈希值。要查找需要使用的 SHA-1 哈希,可以访问 Google Play 控制台中的Release management -&gt; App signing。在发布您的应用程序并等待 10-15 分钟以使其刷新后执行此操作。然后,只需将此 SHA-1 粘贴回 Google API 控制台,然后就可以使用了。

顺便说一句,我的问题与Published App on Play Store can't communicate with Google Maps API and Facebook API 非常相似,尽管没有过多强调为什么 Google API 可能在调试模式下工作,但在 Play 商店中却没有。顺便说一句,我感谢@RohitChauhan,他粘贴了一条包含此问题链接的评论。

【讨论】:

    【解决方案3】:

    你可以试试这个不同的解决方案,也许它对你有用

    解决方案 - 1

    尝试将每个事件的日志保存在文本文件中,例如 onErrorOnPlaceSelectedonConnectionFailedOnConnection 然后将您的应用程序上传到 Playstore 现在运行该应用程序并检查日志文件我确定它是否无法正常工作那么我应该在日志文件中显示一些问题

    解决方案 - 2

    发布 APK 和调试 APK 具有不同的 SHA1 和不同的 Google 服务 API 密钥。两者都必须添加到控制台

    解决方案 - 3

    或者现在您可以使用 intent 来实现自动完成功能

    int PLACE_AUTOCOMPLETE_REQUEST_CODE = 1;
    ...
    try {
    Intent intent =
            new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_FULLSCREEN)
                    .build(this);
    startActivityForResult(intent, PLACE_AUTOCOMPLETE_REQUEST_CODE);
    } catch (GooglePlayServicesRepairableException e) {
    // TODO: Handle the error.
    } catch (GooglePlayServicesNotAvailableException e) {
    // TODO: Handle the error.
    } 
    

    更多详情请看这里-https://developers.google.com/places/android-sdk/autocompleteand仔细阅读

    解决方案 - 4 最后尝试在没有自动完成的情况下将地名显示为 Toast 自定义纬度和经度,以检查我们是否正在从服务器接收数据

    希望对你有帮助

    【讨论】:

    • 我已经在做大部分这些了。你的回答没有解决我的问题。
    • 我对您的回答感到惊讶,因为您在上面 cmets 部分提供的链接很可能是 @NullPointer 偷走的。
    • 分享我你的应用程序 rj.innocent.coder@gmail.com 的 apk
    【解决方案4】:

    我认为问题在于您的 Google 控制台中缺少 SHA-1,即您已经激活 api 的地方。应该有地方添加发布 SHA-1(密钥)。然后您将能够在其他设备上查看 Google 地方信息。

    要生成 SHA-1,在 android studio 中有一个 gradle 脚本。单击位于 Android Studio 右侧的 Gradle 栏。选择您的应用名称,打开tasks&gt;android&gt;signingReport。它将输出所有 SHA-1 密钥。

    【讨论】:

    • 您说得对,问题与签名有关。但正确的 SHA-1 实际上需要来自 Google Play 用于签署发布 APK 的密钥,而不是来自 Android Studio。
    • 是的,你是对的。但!如果您在signingConfigs -&gt; release 部分的build.gradle 中声明了签名密钥 - 执行该脚本将为您提供 SHA-1 以供发布。
    【解决方案5】:

    您可以尝试这个示例项目,我使用地图和地点 api 以及维基百科地理 api。

    https://github.com/XinyueZ/wikipedia-google-place-together

    cos的应该填一个字符串@string/google_maps_key

    可能会对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-27
      • 2012-08-31
      • 2015-12-09
      • 1970-01-01
      • 2015-12-31
      • 2018-06-14
      • 2020-06-01
      • 2018-03-20
      相关资源
      最近更新 更多