Play Store 上发布的应用程序无法与 Google Maps API 和 Facebook API 通信

Posted

技术标签:

【中文标题】Play Store 上发布的应用程序无法与 Google Maps API 和 Facebook API 通信【英文标题】:Published App on Play Store can't communicate with Google Maps API and Facebook API 【发布时间】:2017-11-24 02:27:56 【问题描述】:

我使用 android Studio 创建了一个签名的 APK,并将我的 SHA1 指纹和我的应用程序中的相关 api 密钥添加到 Google 开发者控制台和 Facebook 控制台。如果我通过 USB 上传我签名的 apk,一切正常,在安装它之后,地图 API 和 facebook api 运行良好。如果我将相同的 apk 上传到 Play 商店,当我尝试使用 Facebook 登录时,它会显示“无效的密钥哈希。密钥哈希 blablabla 与任何存储的..都不匹配”。 因此,如果我在没有 facebook 的情况下登录,我什至无法获取我的谷歌地图;这让我认为 Play 商店中加载的 apk 会改变他的指纹或类似的东西。 我检查了 Android Developers 和 *** 上的所有内容,但我无法让它工作,因为奇怪的是,这个签名的发布 apk 在我将它加载到 Play 商店之前运行良好。

【问题讨论】:

对于 Facebook,您需要一个开发者密钥哈希和一个发布密钥哈希。看看这个链接:developers.facebook.com/docs/android/… 看看我对谷歌地图的回答。您需要更改由 Google Play 生成的 SHA-1,请在您的游戏控制台中找到新的 SHA-1 并将其上传到您的谷歌地图 api 中,它就像一个魅力。 你在使用 Firebase 吗? 【参考方案1】:

在@Andy Developer 的启发下,我可以在我的应用上传到 Google Play 后显示地图。这些是步骤:

    将您的应用上传到 Google Play(签名的 APK 文件) 应用提交并通过后,从Google Play Console中选择您的应用 转到开发工具 -> 发布管理 -> 应用签名

    上传应用后复制 Google Play 颁发的第一个 SHA-1 证书。 转到Google Console 并选择您的项目。 选择您的 API 密钥,限制您的密钥,并将 SHA-1 粘贴到包名称之后。

    保存,等待几分钟。并且您的应用应该会显示 Google 地图。

【讨论】:

【参考方案2】:

这是您看不到 Google 地图的原因的答案。

我最近在 Google Play 商店上传了 APK,在检查 Play Console 后我遇到了同样的问题,我找到了解决此问题的方法。

他们的密钥没有问题,但问题在于您的 SHA-1。您使用 SHA-1 签署了您的 APK,这很好,然后上传 APK 也很好。

但是,当您使用 SHA-1 签署 APK 并上传仅由您签署的 APK 时,根据 Play Console 的新更新,但根据新更新,它也由 Google Play 签署以提高安全性。在此处查看 Google Play 部分的某些部分:

使用 Google Play 应用签名:您使用上传密钥对应用进行签名。 然后,Google 会验证并删除上传密钥签名。最后, Google 使用您提供的原始应用签名密钥对应用重新签名 并将您的应用交付给用户。

您可以参考Documentation here.

现在,您的问题的答案是成功上传 APK 后,您可以看到在带有两个 SHA-1 的部分中,第一个 SHA-1 是 Google 创建的第二个SHA-1 是你的

所以只需复制 Google SHA-1 并将其粘贴到您生成 Google Map API 密钥的控制台。

【讨论】:

谢谢你!我花了 3 天的时间试图弄清楚这一点。尽管有很多答案要求更改 sha1 键,但这是清晰明了的。感谢您的帮助。 @AndyDeveloper 谢谢伙计……你真的救了我。我已经从 Firebase 和 Google Console 中删除了我的项目并重新创建并再次配置它,但这没有任何区别。热火朝天你的答案。 @AndyDeveloper 这对我有很大帮助,谢谢。 我必须说,你救了我的命:D 你是我的英雄 :)【参考方案3】:

终于解决了,问题可能是release中没有加载api提供的文件google_maps_api.xml,所以i

我确实是这样的:

buildTypes 
    debug 
        manifestPlaceholders = [mapsKey: "AIzaSyB8o9KzQ5YN8U8AFS************"]
    
    release 
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        manifestPlaceholders = [mapsKey: "AIzaSyApLacqgkdIR7uEpcf*****************"]
    

然后在我的 AndroidManifest 中

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

参考:https://***.com/a/33917692/3235560

然后我注册了 2 个不同的密钥,每个密钥都有正确的 sha1 指纹,一个调试,另一个由 Google Play 控制台提供(不是上传证书,而是由 Google 生成的另一个)。

非常感谢 Zuhad 和 Andy Developer 的启发。

【讨论】:

【参考方案4】:

您的应用程序的调试和发布构建类型使用两个不同的密钥进行签名。

您需要在 Google 地图和 Facebook 中注册这两个密钥,以允许他们访问他们的服务

【讨论】:

我就是这么做的。我还从 Play 商店控制台下载了部署证书,并执行了以下命令 cat deployment_cert.der |openssl sha1 -binary | openssl base64,它为我提供了现在可以使用的 Facebook 登录 api 密钥,但我无法使地图工作。在 /app/src/release/res/values/google_maps_api.xml 下的文件中,我添加了 Maps 控制台提供的密钥,其中我还从我自己的证书(从 android studio 生成)注册了 sha1 指纹,并从玩商店控制台,但它不起作用 您的调试版本是否使用与发布版本不同的 applicationId/package?根据这一点,您可能必须在 Google 地图 API 密钥配置中添加另一个条目 正在生成调试 api 密钥,它正在工作。当我集成签名 API 密钥以发布它也不工作时,请帮助我。生成签名 apk 并再次生成带有签名密钥库文件和别名的签名谷歌地图 api 密钥。 【参考方案5】:

是的,显然地图不会加载到签名的 APK 中。

解决方案:

当您在 Google API 控制台中生成 API 密钥时,您需要使用 SHA 密钥来限制密钥

但是在生成签名 APk 后,您需要获取发布模式 SHA 密钥并在 API 控制台中添加 API

我已附上图片,看看

希望对你有帮助。

【讨论】:

问题是debug和release的api键不一样,其实我写在gradle文件buildTypes debug manifestPlaceholders = [google_map_key: "AIzaSyB8o9KzQ5YN8U8AFSxbTJLheFiubF****"] release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' manifestPlaceholders = [google_map_key: "AIzaSyApLacqgkdIR7uEpcf7EDuGvsQlgh*****"] signingConfig signingConfigs.config 即使我像你说的那样为每个键添加调试 sha1 和发布 sha1 它也不起作用 最好创建一个新的API密钥并尝试实现,我希望只有API密钥是解决方案【参考方案6】:

Facebook 使用以下代码生成哈希键:

try 
        PackageInfo info = getPackageManager().getPackageInfo(
                "YOUR PACKAGE NAME",
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) 
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        
     catch (PackageManager.NameNotFoundException e) 

     catch (NoSuchAlgorithmException e) 

    

收到哈希码后,将其粘贴到 Facebook 开发者控制台并继续操作

希望对你有帮助:)

【讨论】:

以上是关于Play Store 上发布的应用程序无法与 Google Maps API 和 Facebook API 通信的主要内容,如果未能解决你的问题,请参考以下文章

Espresso:与 Play Store Popup 互动

Play Store 没有在 Play Store 上发布我的应用,具有 BIND_DEVICE_ADMIN、DEVICE_ADMIN_DISABLE_REQUESTED 和 DEVICE_ADMIN

代表另一家公司在 Google Play Store 上发布应用

有人设法在 Play Store 上发布具有短信和通话记录权限的应用程序吗?

好评,但在 Play Store/App Store 上 1 星。我怎么解决这个问题?

可以在 google play store 上设置发布日期吗?