Google Places for Android API密钥不适用于Play商店中的应用

时间:2018-07-03 16:36:49

标签: android api-key googleplacesautocomplete

我最近launched an Android app使用了Google地方信息自动填充小部件/ 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都可以使用。无论我使用的是debug还是release模式,都是如此。
  • 当我使用完全相同的代码将APK发布到Play商店,然后安装该应用程序时,除了Google自动填充API损坏之外,其他所有功能都可以正常运行。尝试访问它时,它会立即关闭。

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

我很困惑地解释这一点。这个问题特别困难,因为一切都可以在Android Studio上运行,所以我无法执行调试并尝试捕获异常的操作。

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

5 个答案:

答案 0 :(得分:2)

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

问题:实际上,到目前为止,您只需使用上传密钥对应用进行签名,但是对于Play商店,您需要 google创建的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。

答案 1 :(得分:1)

您可以尝试使用不同的解决方案,也许对您来说有用

解决方案-1

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

解决方案-2

发布APK和调试APK具有不同的SHA1和Google服务的不同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/autocompleteand仔细阅读

解决方案-4  最后尝试将地名显示为 Toast ,并自定义纬度和经度,而无需自动完成操作,以检查我们是否从服务器接收数据

希望这对您有帮助

答案 2 :(得分:1)

@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 -> 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 :(得分:0)

我认为问题出在您的Google控制台(您已激活api的地方)中缺少SHA-1。应该有添加发行版本SHA-1(密钥)的地方。然后,您将可以在其他设备上看到Google地方信息。

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

enter image description here

答案 4 :(得分:-1)

您可以尝试这个示例项目,在该示例项目中,我使用地图和api以及Wikipedia geo api。

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

在cos中,您应该填写字符串@string/google_maps_key

可能会帮助您。

相关问题