Google Android API 密钥的位置不适用于 Play 商店的应用
Google Places for Android API key does not work on app from Play Store
我最近 launched an Android app 使用了 Google 地点自动完成功能 widget/API。作为此配置的一部分,我将 API 键添加到我的 Android 的清单文件中:
<application>
...
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="MY_KEY_HERE"/>
</application>
此外,在 Google 开发者控制台中,我只为 Android 设备启用了这个 API 键,但不限于任何特定的 API。我还为我的应用程序输入了正确的包名称和 SHA-1 哈希值。现在我有以下问题:
- 当我直接从 Android Studio 将应用程序部署到 Android phone 时,Google API 都可以正常工作。无论我使用调试模式还是发布模式变体都是如此。
- 当我使用完全相同的代码将 APK 发布到 Play 商店,然后安装该应用程序时,除了 Google 自动完成 API 损坏外,一切正常。尝试访问它时,它会立即关闭。
我确定我部署到 Play 商店的实际上是本地的同一个应用程序 运行,因为我最近也做了一些小 UI 补丁,这些补丁也出现在商店版本。我多次验证了清单文件中显示的正确密钥。
我无法解释这一点。这个问题特别困难,因为一切都在 Android Studio 中运行,所以我无法执行诸如进入调试并尝试捕获异常之类的操作。
如果您对 Android 和自动完成有一定的了解,并且遇到过类似的问题,欢迎您的回答。
你的陈述有问题===>我也为我的应用程序输入了正确的包名称和 SHA-1 哈希值
问题: 实际上到目前为止,您只是使用 上传密钥 对您的应用进行签名,但对于 Play 商店,您需要 google 创建了 SHA-1 .
这里有更详细的解释
How app signing by Google Play works.[Document Link]
Step 1: Create an upload key
Step 2: Prepare your release
Step 3: Upload your signed app
Step 4: Register your app signing key with API providers
Before the app is delivered to users, Google Play will remove your upload key signature and re-sign with a new key.
这意味着您使用上传密钥签署了您的应用程序。然后,Google 验证并删除上传密钥签名。最后,Google 使用您提供的原始应用签名密钥对应用重新签名,并将您的应用交付给用户。
因此,为了解决您的问题,您需要在将您的应用上传到 Google Play 并且应用已提交并获得批准后执行这些额外步骤
Select 您的应用来自 Google Play 控制台,转到开发工具 -> 发布管理 -> 应用签名。
复制 Google Play 在上传应用后颁发的第一个 SHA-1 证书。
转到 Google 控制台并转到您的项目。
Select 您的 API-密钥,并在包名称后粘贴 SHA-1。
您可以试试这个示例项目,我在其中使用地图并放置 api 以及 wikipedia geo api。
https://github.com/XinyueZ/wikipedia-google-place-together
cos的,你应该填一个字符串@string/google_maps_key
可能对你有帮助。
我认为问题出在您的 Google 控制台中缺少 SHA-1,您已经激活了 api 个地方。应该有添加发布 SHA-1(密钥)的地方。然后您将能够在其他设备上看到 Google 个地点。
要生成 SHA-1,android studio 中有一个 gradle 脚本。单击位于 Android Studio 右侧的 Gradle 栏。 Select 您的应用名称,打开 tasks>android>signingReport
。它将输出所有 SHA-1 密钥。
您可以尝试这些不同的解决方案,也许它适合您
解 - 1
尝试将每个事件的日志保存在文本文件中,例如 onError、OnPlaceSelected、onConnectionFailed, OnConnection
然后立即将您的应用程序上传到 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 并带有自定义纬度和经度而不自动完成以检查我们是否从服务器接收数据
希望对您有所帮助
@NullPointer 的回答在功能上是正确的,确实解决了我的问题。但是为了更直接地回答我自己的问题,问题的根本原因与为 Android 的本地调试版本配置 Google APIs 的过程有很大不同。应用程序和同一应用程序的发布版本。
这里的部分混淆与 Google 控制台本身有关,它说:
Then use the following command to get the (SHA-1) fingerprint:
keytool -list -v -keystore mystore.keystore
在本地构建和测试应用程序时,在调试模式下,实际上 运行 keytool
针对调试密钥库文件,并将 SHA-1 哈希粘贴到 Google 控制台将使 API 工作。在代码库上坐了几个月或更长时间后,APIs 看起来非常稳定,当对发布的 APK 重复这些步骤时,接下来会发生什么令人惊讶。
令人惊讶,因为遵循相同的步骤对发布应用程序不起作用。这是因为 Google Play 商店实际上使用不同的密钥重新注册您的 APK,因此具有不同的 SHA-1 哈希值。要找到需要使用的 SHA-1 哈希,可以访问 Google Play 控制台中的 Release management -> App signing
。在发布您的应用程序并等待 10-15 分钟刷新后执行此操作。然后,只需将此 SHA-1 粘贴回 Google API 控制台,然后就可以了。
顺便说一句,我的问题与 非常相似,虽然没有太多强调为什么 Google API 可能在调试模式下工作,但不是在 Play 商店。顺便说一句,我赞扬@RohitChauhan,他对这个问题粘贴了一条包含 link 的评论。
我最近 launched an Android app 使用了 Google 地点自动完成功能 widget/API。作为此配置的一部分,我将 API 键添加到我的 Android 的清单文件中:
<application>
...
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="MY_KEY_HERE"/>
</application>
此外,在 Google 开发者控制台中,我只为 Android 设备启用了这个 API 键,但不限于任何特定的 API。我还为我的应用程序输入了正确的包名称和 SHA-1 哈希值。现在我有以下问题:
- 当我直接从 Android Studio 将应用程序部署到 Android phone 时,Google API 都可以正常工作。无论我使用调试模式还是发布模式变体都是如此。
- 当我使用完全相同的代码将 APK 发布到 Play 商店,然后安装该应用程序时,除了 Google 自动完成 API 损坏外,一切正常。尝试访问它时,它会立即关闭。
我确定我部署到 Play 商店的实际上是本地的同一个应用程序 运行,因为我最近也做了一些小 UI 补丁,这些补丁也出现在商店版本。我多次验证了清单文件中显示的正确密钥。
我无法解释这一点。这个问题特别困难,因为一切都在 Android Studio 中运行,所以我无法执行诸如进入调试并尝试捕获异常之类的操作。
如果您对 Android 和自动完成有一定的了解,并且遇到过类似的问题,欢迎您的回答。
你的陈述有问题===>我也为我的应用程序输入了正确的包名称和 SHA-1 哈希值
问题: 实际上到目前为止,您只是使用 上传密钥 对您的应用进行签名,但对于 Play 商店,您需要 google 创建了 SHA-1 .
这里有更详细的解释
How app signing by Google Play works.[Document Link]
Step 1: Create an upload key
Step 2: Prepare your release
Step 3: Upload your signed app
Step 4: Register your app signing key with API providers
Before the app is delivered to users, Google Play will remove your upload key signature and re-sign with a new key.
这意味着您使用上传密钥签署了您的应用程序。然后,Google 验证并删除上传密钥签名。最后,Google 使用您提供的原始应用签名密钥对应用重新签名,并将您的应用交付给用户。
因此,为了解决您的问题,您需要在将您的应用上传到 Google Play 并且应用已提交并获得批准后执行这些额外步骤
Select 您的应用来自 Google Play 控制台,转到开发工具 -> 发布管理 -> 应用签名。
复制 Google Play 在上传应用后颁发的第一个 SHA-1 证书。
转到 Google 控制台并转到您的项目。
Select 您的 API-密钥,并在包名称后粘贴 SHA-1。
您可以试试这个示例项目,我在其中使用地图并放置 api 以及 wikipedia geo api。
https://github.com/XinyueZ/wikipedia-google-place-together
cos的,你应该填一个字符串@string/google_maps_key
可能对你有帮助。
我认为问题出在您的 Google 控制台中缺少 SHA-1,您已经激活了 api 个地方。应该有添加发布 SHA-1(密钥)的地方。然后您将能够在其他设备上看到 Google 个地点。
要生成 SHA-1,android studio 中有一个 gradle 脚本。单击位于 Android Studio 右侧的 Gradle 栏。 Select 您的应用名称,打开 tasks>android>signingReport
。它将输出所有 SHA-1 密钥。
您可以尝试这些不同的解决方案,也许它适合您
解 - 1
尝试将每个事件的日志保存在文本文件中,例如 onError、OnPlaceSelected、onConnectionFailed, OnConnection 然后立即将您的应用程序上传到 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 并带有自定义纬度和经度而不自动完成以检查我们是否从服务器接收数据
希望对您有所帮助
@NullPointer 的回答在功能上是正确的,确实解决了我的问题。但是为了更直接地回答我自己的问题,问题的根本原因与为 Android 的本地调试版本配置 Google APIs 的过程有很大不同。应用程序和同一应用程序的发布版本。
这里的部分混淆与 Google 控制台本身有关,它说:
Then use the following command to get the (SHA-1) fingerprint:
keytool -list -v -keystore mystore.keystore
在本地构建和测试应用程序时,在调试模式下,实际上 运行 keytool
针对调试密钥库文件,并将 SHA-1 哈希粘贴到 Google 控制台将使 API 工作。在代码库上坐了几个月或更长时间后,APIs 看起来非常稳定,当对发布的 APK 重复这些步骤时,接下来会发生什么令人惊讶。
令人惊讶,因为遵循相同的步骤对发布应用程序不起作用。这是因为 Google Play 商店实际上使用不同的密钥重新注册您的 APK,因此具有不同的 SHA-1 哈希值。要找到需要使用的 SHA-1 哈希,可以访问 Google Play 控制台中的 Release management -> App signing
。在发布您的应用程序并等待 10-15 分钟刷新后执行此操作。然后,只需将此 SHA-1 粘贴回 Google API 控制台,然后就可以了。
顺便说一句,我的问题与