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

Kotlin中GoogleSignInClient跨设备返回RESULT_CANCELED问题

Google登录跨电脑运行返回RESULT_CANCELED的原因及解决办法

问题重现

基于Firebase实现的Google登录在主开发电脑正常运行,但复制项目到另一台电脑后,点击登录按钮始终返回RESULT_CANCELED,无法进入RESULT_OK分支。核心代码如下:

class LoginActivity : AppCompatActivity() {

    private lateinit var binding: ActivityLoginBinding
    private lateinit var signInButton: SignInButton
    private lateinit var textView: TextView

    private lateinit var signInClient: GoogleSignInClient

    private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            // never comes here
            textView.text = "Login result " + result.resultCode.toString()
        }
        else
            textView.text = "Login result " + result.resultCode.toString()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityLoginBinding.inflate(layoutInflater)
        setContentView(binding.root)
        var gso: GoogleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build()
        signInClient = GoogleSignIn.getClient(this, gso)

        textView = binding.textView
        signInButton = binding.signInButton
        signInButton.setOnClickListener {
            launcher.launch(signInClient.signInIntent)
        }
    }
}

核心原因及解决步骤

1. 签名证书指纹不匹配(最常见)

Google登录和Firebase认证依赖应用的签名SHA-1指纹做身份校验,默认的debug keystore是电脑本地生成的,不同电脑的debug keystore指纹完全不同。原电脑的指纹已经在Firebase/Google Cloud控制台注册,新电脑的指纹未注册,导致登录请求被拒绝,返回取消状态。

解决办法:

  • 获取新电脑的debug SHA-1指纹:
    • Mac/Linux终端执行:
      keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
      
    • Windows命令提示符执行:
      keytool -list -v -keystore C:\Users\<你的用户名>\.android\debug.keystore -alias androiddebugkey -storepass android -keypass android
      
  • 打开Firebase控制台,进入项目设置 → 应用管理 → 添加该SHA-1指纹;也可以直接在Google Cloud控制台的OAuth 2.0客户端ID页面更新指纹。
  • 下载更新后的google-services.json文件,替换项目app模块下的对应文件。

2. Firebase配置文件缺失或不一致

复制项目时可能遗漏了google-services.json,或者该文件中的客户端信息与新电脑的签名指纹不匹配,导致认证流程失败。

解决办法:

  • 确认项目app目录下存在google-services.json,且该文件是从Firebase控制台下载的最新版本(包含新电脑的SHA-1指纹)。

3. 依赖版本或SDK环境差异

新电脑的Android SDK版本、Google Play Services依赖版本与原电脑不一致,可能导致登录流程出现兼容性问题。

解决办法:

  • 对比两台电脑的build.gradle(项目级和模块级),确保com.google.firebase:firebase-auth、com.google.android.gms:play-services-auth等依赖版本完全一致。
  • 同步项目并更新SDK到相同版本。

补充:代码优化建议

当前代码仅处理了结果状态,未完成Firebase的最终认证步骤,登录成功后需获取Google登录凭证并传给Firebase,示例代码如下:

private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
        try {
            val account = task.getResult(ApiException::class.java)
            // 将Google登录凭证转换为Firebase认证凭证
            val credential = GoogleAuthProvider.getCredential(account.idToken, null)
            FirebaseAuth.getInstance().signInWithCredential(credential)
                .addOnCompleteListener { authTask ->
                    textView.text = if (authTask.isSuccessful) "登录成功" else "Firebase认证失败"
                }
        } catch (e: ApiException) {
            textView.text = "登录失败: ${e.message}"
        }
    } else {
        textView.text = "Login result " + result.resultCode.toString()
    }
}

内容的提问来源于stack exchange,提问作者Roihu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:30:56