android - 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:
- Web 应用程序(代码中的那个)
- Android(使用 SHA1 和包名签名)
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 签署应用程序的预期行为吗?
我无法想象这对大型团队来说是如何工作的。我相信我们在这里遗漏了一些东西,所以如果有更有经验的人能启发我们,我将不胜感激。谢谢你,祝你有美好的一天。
解决方案
您可以从您的团队中复制一个调试密钥并将其提供给所有团队成员。
调试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"
}
*/
}
推荐阅读
- scala - 使用 spark sql 和 scala 处理编码字符的 spark 数据清理
- css - 在一个元素上堆叠两个线性渐变背景,但颜色和高度不同
- php - 如何使用 API 密钥发出 curl 请求?
- java - Eclipse Scala 在 Mac OS 上启动时崩溃
- excel - 使用 Excel 添加基于 id 的总和
- vb.net - 如何将占位符放入我的用户名和密码文本框中,而 Visual Basic 将其作为没有值的文本框进行威胁?
- django - Django 和 celery:为 'celery' 程序设置 DJANGO_SETTINGS_MODULE 有什么需要,因为它已经在 manage.py 中设置了
- reactjs - 刷新页面时 Gatsby 链接状态丢失
- android - 使用 SVG。难道画质不会变?
- micronaut - 从资源加载文件