首页 > 解决方案 > Google getSignedInAccountFromIntent 因代码 10 而崩溃

问题描述

我们正在我们的移动应用程序中实施 Google 登录并使用后端服务器进行身份验证。

开发人员 A 有以下代码

val GOOGLE_OAUTH2_CLIENT_ID = "1234567890123-abcdef....apps.googleusercontent.com"

val gSignOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestIdToken(GOOGLE_OAUTH2_CLIENT_ID)
    .requestEmail()
    .build()

val clientGoogleSignIn = GoogleSignIn.getClient(this, gSignOptions)

findViewById<Button>(R.id.welcome_get_started_button).setOnClickListener {
    startActivityForResult(clientGoogleSignIn.signInIntent, RC_GOOGLE_SIGN_IN)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
{
    super.onActivityResult(requestCode, resultCode, data)
    try
    {
        if (requestCode == RC_GOOGLE_SIGN_IN)
        {
            val googleAccount = GoogleSignIn.getSignedInAccountFromIntent(data) // FAILING LINE
               .getResult(ApiException::class.java)
            googleAccount?.let {
                log("D", "Google sign-in completed with ${it.email} and token ${it.idToken}")
                processGSignInAndStartNextActivity(it)
            }
        }
    }
    catch (e: Throwable)
    {
        log("E", "onActivityResult failed", e)
    }
}

在 Google project > API > Credentials 页面中,我们有两个客户端 ID:

Android Studio 自己产生的SHA1:Gradle > signingReport

一切都按照谷歌文档完成,一切正常。

现在开发者 B 进来了。

他提取相同的代码并使用相同的调试配置。相同的 Android Studio 版本、相同的 Kotlin 版本、相同的 Google Play 服务版本。他运行代码,但始终失败

 com.google.android.gms.common.api.ApiException: 10: 
        at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(Unknown Source:4)
        at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source:8)

我们花了几个小时尝试了一切——更改代码、卸载、不同的 AVD、不同的 JVM 版本,没有任何帮助。最终我们决定他应该创建自己的 Android 令牌,因为它是零意义的,所以为什么不呢。原来他由 Android Studio 生成的 SHA1 是不同的……只要他从那个 SHA1 创建了另一个客户端 ID,代码就为他工作了。现在我们有 3 个客户端 ID:Web App、Android-DevA、Android-DevB。

这是每个 Android 开发人员都假设使用唯一 SHA1 和客户端 ID 签署应用程序的预期行为吗?

我无法想象这对大型团队来说是如何工作的。我相信我们在这里遗漏了一些东西,所以如果有更有经验的人能启发我们,我将不胜感激。谢谢你,祝你有美好的一天。

标签: androidandroid-studiokotlingoogle-signin

解决方案


您可以从您的团队中复制一个调试密钥并将其提供给所有团队成员。

调试Keystore应位于~/.android/debug.keystore.

或者您可以制作另一个Keystore并在开发人员之间共享并在gradle.

android {

    // ...

    signingConfigs {
        debug {
            storeFile file('../debug.keystore')
        }

        /*
        for release:
        release {
            storeFile file('release.keystore')
            storePassword "password"
            keyAlias "alias"
            keyPassword "alias_password"
        }
        */
    }

推荐阅读