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

迁移至Credential Manager API时如何保留旧安卓设备的Firebase登录支持?

解决方案:兼容低版本设备的Credential Manager迁移方案

核心思路:版本适配+降级策略

不用强制将minSDK升级到34,而是通过条件编译+旧API降级的方式,让高版本设备用Credential Manager,低版本设备继续沿用旧的Google登录API,同时保持SDK正常升级,直到你可以逐步淘汰低版本用户为止。

1. 同时保留新旧API依赖

在build.gradle中同时引入Credential Manager和旧版Google登录的依赖,无需移除旧依赖:

// Credential Manager 核心依赖
implementation "androidx.credentials:credentials:1.2.0"
implementation "androidx.credentials:credentials-play-services-auth:1.2.0"
// 旧版Google登录依赖(暂时保留)
implementation 'com.google.android.gms:play-services-auth:20.7.0'

2. 按API版本拆分登录逻辑

在登录代码中,根据设备的API版本选择对应流程:

  • API 34及以上:使用Credential Manager的GetGoogleIdOption实现登录
  • API 33及以下:继续使用旧的BeginSignInRequest流程

示例代码结构:

private const val REQ_GOOGLE_SIGN_IN = 1001

fun startGoogleLogin(context: Context, lifecycleScope: CoroutineScope) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
        // 高版本设备:Credential Manager 登录流程
        val googleIdOption = GetGoogleIdOption.Builder()
            .setFilterByAuthorizedAccounts(false)
            .setServerClientId("你的Web客户端ID")
            .build()
        val request = GetCredentialRequest.Builder()
            .addCredentialOption(googleIdOption)
            .build()

        val credentialManager = CredentialManager.create(context)
        lifecycleScope.launch {
            try {
                val result = credentialManager.getCredential(context, request)
                // 转换为Firebase认证凭证
                val googleIdToken = (result.credential as GoogleIdTokenCredential).idToken
                val firebaseCredential = GoogleAuthProvider.getCredential(googleIdToken, null)
                FirebaseAuth.getInstance().signInWithCredential(firebaseCredential)
                    .addOnCompleteListener { task ->
                        if (task.isSuccessful) {
                            // 登录成功逻辑
                        } else {
                            // 登录失败处理
                        }
                    }
            } catch (e: Exception) {
                // 可降级到旧流程或提示用户重试
            }
        }
    } else {
        // 低版本设备:旧版Google登录流程
        val signInRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    .setServerClientId("你的Web客户端ID")
                    .setFilterByAuthorizedAccounts(false)
                    .build()
            )
            .build()

        val signInClient = Identity.getSignInClient(context)
        signInClient.beginSignIn(signInRequest)
            .addOnSuccessListener { result ->
                try {
                    (context as Activity).startIntentSenderForResult(
                        result.pendingIntent.intentSender,
                        REQ_GOOGLE_SIGN_IN,
                        null, 0, 0, 0, null
                    )
                } catch (e: IntentSender.SendIntentException) {
                    // 异常处理
                }
            }
            .addOnFailureListener {
                // 登录失败处理
            }
    }
}

// 处理旧版登录的回调(低版本设备用)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQ_GOOGLE_SIGN_IN) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        try {
            val account = task.getResult(ApiException::class.java)
            val idToken = account.idToken
            val firebaseCredential = GoogleAuthProvider.getCredential(idToken, null)
            FirebaseAuth.getInstance().signInWithCredential(firebaseCredential)
                .addOnCompleteListener { /* 处理登录结果 */ }
        } catch (e: ApiException) {
            // 登录失败处理
        }
    }
}

3. 逐步过渡,监控用户占比

  • 加入埋点统计,跟踪不同API版本用户的登录行为和占比变化
  • 当低版本用户占比降到可接受范围(比如5%以下),再彻底移除旧API依赖并升级minSDK到34

4. 保持SDK正常升级的注意事项

  • 定期升级Firebase和Google Play服务依赖,只要依赖本身支持当前minSDK,就不会影响其他功能
  • 升级时检查依赖兼容性,若新依赖与旧版Google登录有冲突,可调整依赖版本或临时保留兼容版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:34:58