Google getSignedInAccountFromIntent 崩溃,代码为 10

Google getSignedInAccountFromIntent crashing with code 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 项目 > API > 凭据页面中,我们有两个客户端 ID:

SHA1 由 Android Studio 本身生成:Gradle > signingReport

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

现在开发者 B 进来了。

他提取相同的代码并使用相同的调试配置。相同的 Android Studio 版本,相同的 Kotlin 版本,相同的 Google Play Services 版本。他运行代码,但一直失败

 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 签署应用程序的预期行为吗?

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

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

调试 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"
        }
        */
    }