Firebase谷歌登录时registerForActivityResult总返回RESULT_CANCELED如何解决
问题核心原因
Google登录返回RESULT_CANCELED九成以上是签名、SHA256配置或者客户端ID匹配的问题,因此前功能可正常运行,优先排查近期变更的配置项。
必查配置项
- 首先检查Firebase控制台项目的Android应用SHA-256指纹是否和当前打包使用的签名文件指纹一致:
本地debug签名指纹获取命令:keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
正式签名使用自己的keystore路径、别名、密码替换参数即可获取对应指纹 - 确认
strings.xml里的server_client_id值和Firebase控制台「项目设置」→「Web API密钥」对应的客户端ID完全一致,注意不要误填为Android客户端ID - 检查Google Cloud控制台对应项目的OAuth同意屏幕状态,如果是测试模式,确认测试用户列表是否包含当前测试用的谷歌账号,未添加的测试账号发起登录会直接返回取消
- 如果近期升级过
com.google.gms:google-services、firebase-auth或play-services-auth依赖版本,检查版本兼容性:firebase-auth和play-services-auth的大版本要匹配,不要跨大版本混用
代码优化排查
1. 临时关闭账号重复校验逻辑
你当前代码中checkDelicacy判断逻辑存在误判可能:本地存在已登录的谷歌账号,不代表该账号在你的Firebase项目中有注册记录,也存在用户本地授权过期的情况,建议先临时注释该判断,排除逻辑拦截问题:
fun getSignInIntent(context: Context): Intent? { // 临时注释这段测试,排查是不是判断逻辑导致的问题 /*val duplicate = checkDelicacy(context) if(duplicate){ Toast.makeText(context, "Already a member, Please logIn", Toast.LENGTH_SHORT).show() } else { return googleSignInClient.signInIntent } return null*/ return googleSignInClient.signInIntent }
2. 添加错误日志打印
在登录回调中增加错误信息打印,可直接定位具体错误原因:
private var googleLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> // 新增错误日志打印 if (result.resultCode == RESULT_CANCELED && result.data != null) { val status = GoogleSignIn.getStatusFromIntent(result.data) Log.e("GoogleLogin", "错误码: ${status?.statusCode}, 错误信息: ${status?.statusMessage}") } // 保留原有逻辑不变 when (result.resultCode) { RESULT_OK-> { val data: Intent? = result.data val task = GoogleSignIn.getSignedInAccountFromIntent(data) try { val account = task.getResult(ApiException::class.java)!! sharedViewModel.firebaseAuthWithGoogle(account.idToken!!, requireContext()) binding.passwordEt.setText("") binding.emailEt.setText("") } catch (e: ApiException) { Toast.makeText(requireContext(), e.message, Toast.LENGTH_SHORT).show() } } RESULT_CANCELED->{ Toast.makeText(requireContext(),"result failed",Toast.LENGTH_SHORT).show() } } }
错误码对应说明:12500为通用配置错误、12501为OAuth同意屏幕配置问题、10为客户端ID不匹配。
临时测试方案
如果上述排查后仍有问题,可卸载测试设备上的应用,清除Google Play服务缓存,重启设备后重新安装测试,排除本地缓存的旧授权信息冲突导致的异常。
内容的提问来源于stack exchange,提问作者Aman Sharma
相关产品推荐
相关产品推荐

