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:
- Web 应用程序(代码中的那个)
- Android(用 SHA1 和包名签名)
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"
}
*/
}
我们正在我们的移动应用程序中实现 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:
- Web 应用程序(代码中的那个)
- Android(用 SHA1 和包名签名)
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"
}
*/
}