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
- Mac/Linux终端执行:
- 打开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
相关产品推荐
相关产品推荐

