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

Android Kotlin中Google登录返回RESULT_CANCELED问题求助

问题描述

课堂实践中使用Kotlin+Android Studio开发应用,集成Google登录功能时,选择账号后返回的Activity Result始终为RESULT_CANCELED,无法完成登录。已完成以下配置:

  • 在Firebase中配置SHA1和SHA-256指纹,导入配置JSON文件
  • 在Google Cloud创建OAuth客户端,将对应邮箱设置为default_web_client_id

目前可正常弹出Google账号选择弹窗,但点击账号后弹窗关闭,返回结果为RESULT_CANCELED。相关代码如下:

auth = FirebaseAuth.getInstance()
val db = Firebase.firestore

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestIdToken(getString(R.string.default_web_client_id))
    .requestEmail()
    .build()

googleSignInClient = GoogleSignIn.getClient(this, gso)

findViewById<Button>(R.id.btnSignInWithGoogle).setOnClickListener {
    signInWithGoogle()
}

/// Functions
private fun signInWithGoogle() {
    val signInIntent = googleSignInClient.signInIntent
    launcher.launch(signInIntent)
}

private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if(result.resultCode == Activity.RESULT_OK){
        val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
        handleResults(task)
    }
    else if (result.resultCode == Activity.RESULT_CANCELED){
        // 可在此添加日志输出排查
    }
}

private fun handleResults(task: Task<GoogleSignInAccount>) {
    if (task.isSuccessful) {
        val account: GoogleSignInAccount? = task.result
        updateUI(account)
    } else {
        updateUI(null)
    }
}

private fun updateUI(account: GoogleSignInAccount?) {
    if (account != null) {
        val credential = GoogleAuthProvider.getCredential(account.idToken, null)
        auth.signInWithCredential(credential).addOnCompleteListener {
            if (it.isSuccessful) {
                Log.d(TAG, "signInWithGoogle: Firebase authentication successful")
                val intent = Intent(this, Register::class.java)
                startActivity(intent)
                finish()
            } else {
                Log.w(TAG, "signInWithGoogle: Firebase authentication failed", it.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed: ${it.exception?.message}",
                    Toast.LENGTH_SHORT
                ).show()
            }
        }
    } else {
        Log.w(TAG, "Google account is null")
        Toast.makeText(this, "Google account is null", Toast.LENGTH_SHORT).show()
    }
}
排查方案
  • 校验OAuth客户端ID类型与匹配性:
    Google Cloud中配置的default_web_client_id必须是Web应用类型的客户端ID,不能使用Android类型。同时确认Android类型OAuth客户端的包名、SHA1指纹和当前应用完全一致。

  • 重新确认Firebase配置文件:
    重新下载Firebase控制台的google-services.json文件替换项目旧文件,检查文件内oauth_client条目,确保Web类型客户端的client_id和strings.xml中配置的default_web_client_id完全相同。另外确认应用模块build.gradle末尾已添加Google服务插件:

    apply plugin: 'com.google.gms.google-services'
    
  • 核对签名密钥指纹:
    确认当前运行应用使用的签名密钥对应的SHA1/SHA-256指纹已添加到Firebase和Google Cloud中。调试版本可通过以下命令获取默认调试密钥指纹:

    keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
    
  • 查看Logcat获取具体错误信息:
    在RESULT_CANCELED分支添加日志输出,或直接在Logcat中搜索GoogleSignIn、FirebaseAuth关键词,通常会返回具体失败原因(如客户端ID不匹配、签名验证失败等):

    else if (result.resultCode == Activity.RESULT_CANCELED){
        Log.w(TAG, "Google sign-in canceled: check Logcat for detailed errors")
    }
    
  • 更新设备上的Google Play服务:
    确保测试设备安装了最新版本的Google Play服务,旧版本可能导致登录流程异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:27:24