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

Kotlin Compose集成Firebase谷歌登录返回IntentSender null求助

解决Kotlin Compose中Firebase谷歌登录返回null IntentSender的问题

可能的原因及解决方案

1. 确认Web Client ID配置正确

确保R.string.web_client_id对应的是Firebase控制台中Web应用的客户端ID,而非Android应用的。谷歌登录的ID Token验证依赖Web客户端ID,Android客户端ID仅用于SHA-1校验。

2. 捕获并分析具体异常

当前代码仅捕获通用Exception并返回null,无法定位具体问题。修改signIn()方法,捕获ApiException以获取错误码:

suspend fun signIn(): IntentSender? {
    return try {
        val result = oneTapClient.beginSignIn(buildSignInRequest()).await()
        result.pendingIntent.intentSender
    } catch (e: ApiException) {
        e.printStackTrace()
        Log.e("GoogleAuth", "Sign in failed with code: ${e.statusCode}, message: ${e.message}")
        // 根据错误码处理不同场景
        when(e.statusCode) {
            CommonStatusCodes.CANCELED -> {
                Toast.makeText(context, "登录已取消", Toast.LENGTH_SHORT).show()
            }
            SignInStatusCodes.NO_SAVED_CREDENTIALS -> {
                Toast.makeText(context, "未检测到谷歌账号,请先添加账号", Toast.LENGTH_SHORT).show()
            }
            else -> {
                Toast.makeText(context, "登录失败:${e.message}", Toast.LENGTH_SHORT).show()
            }
        }
        null
    } catch (e: CancellationException) {
        throw e
    } catch (e: Exception) {
        e.printStackTrace()
        Toast.makeText(context, "登录出错", Toast.LENGTH_SHORT).show()
        null
    }
}

3. 调整BeginSignInRequest配置

尝试关闭自动选择或指定账号类型,避免因配置问题导致无返回结果:

private fun buildSignInRequest(): BeginSignInRequest {
    return BeginSignInRequest.Builder()
        .setGoogleIdTokenRequestOptions(
            GoogleIdTokenRequestOptions.builder()
                .setSupported(true)
                .setFilterByAuthorizedAccounts(false)
                .setServerClientId(context.getString(R.string.web_client_id))
                .build()
        )
        .setAccountTypes("com.google") // 指定仅谷歌账号
        .setAutoSelectEnabled(false) // 关闭自动选择,强制用户选择账号
        .build()
}

4. 处理无谷歌账号的场景

如果设备未登录任何谷歌账号,One Tap登录会返回null。此时可以 fallback 到传统谷歌登录流程:

// 在GoogleAuthUIClient中添加备用登录方法
fun getFallbackSignInIntent(): Intent {
    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(context.getString(R.string.web_client_id))
        .requestEmail()
        .build()
    val signInClient = GoogleSignIn.getClient(context, gso)
    return signInClient.signInIntent
}

然后在点击事件中处理:

// MainActivity.kt中修改onSignInClick
onSignInClick = {
    lifecycleScope.launch {
        val signInIntentSender = googleAuthUIClient.signIn()
        if (signInIntentSender != null) {
            launcher.launch(
                IntentSenderRequest.Builder(signInIntentSender).build()
            )
        } else {
            // 使用备用登录流程
            val fallbackLauncher = rememberLauncherForActivityResult(
                ActivityResultContracts.StartActivityForResult()
            ) { result ->
                if (result.resultCode == RESULT_OK) {
                    lifecycleScope.launch {
                        val signInResult = googleAuthUIClient.signInWithIntent(result.data ?: return@launch)
                        viewModel.onSignInResult(signInResult)
                    }
                }
            }
            fallbackLauncher.launch(googleAuthUIClient.getFallbackSignInIntent())
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:42:06