13

我最近推出了一个使用 Google Places 自动完成小部件/API的 Android 应用程序。作为配置的一部分,我将 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 和自动完成有一定的专业知识,并且您遇到过类似的问题,那么我欢迎您的回答。

4

5 回答 5

12

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

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

这里有更详细的解释

Google Play 应用签名的工作原理。[文档链接]

第 1 步:创建上传密钥

第 2 步:准备发布

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

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

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

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

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

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

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

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

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

于 2018-07-12T14:23:55.013 回答
3

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

这里的部分混乱与谷歌控制台本身有关,它说:

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

keytool -list -v -keystore mystore.keystore

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

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

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

于 2018-07-12T16:13:42.077 回答
1

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

解决方案 - 1

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

解决方案 - 2

发布 APK 和调试 APK 具有不同的 SHA1 和不同的谷歌服务 API 密钥。它们都必须添加到控制台

解决方案 - 3

或者现在您可以将意图用于自动完成功能

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/autocomplete并仔细阅读

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

希望这对你有帮助

于 2018-07-12T14:46:39.703 回答
0

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

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

在此处输入图像描述

于 2018-07-12T14:40:05.250 回答
-1

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

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

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

可能会帮助你。

于 2018-07-12T14:36:02.460 回答