You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:24:02