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

实现Google登录时startActivityForResult被废弃,如何用registerForActivityResult替代

Google登录startActivityForResult废弃替换方案

完整实现步骤

1. 声明登录结果回调Launcher

在Activity或者Fragment的成员变量位置直接初始化结果处理器,不要放在点击事件或者方法内部声明:

import android.app.Activity
import androidx.activity.result.contract.ActivityResultContracts
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.common.api.ApiException

// 成员变量位置初始化
private val googleSignInLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        // 此处替换为你原来onActivityResult中RC_SIGN_IN对应的处理逻辑即可
        val signInTask = GoogleSignIn.getSignedInAccountFromIntent(result.data)
        try {
            val signInAccount = signInTask.getResult(ApiException::class.java)
            // 拿到账号信息后执行自己的业务逻辑,比如获取id_token发送到服务端校验
        } catch (e: ApiException) {
            // 登录异常处理
        }
    }
    // 可自行补充RESULT_CANCELED等其他返回码的处理逻辑
}

2. 替换触发登录的代码

原来调用startActivityForResult的位置替换为调用launcher的launch方法:

val signInIntent = googleSignInClient.signInIntent
googleSignInLauncher.launch(signInIntent)

注意事项

  • registerForActivityResult必须在Activity的onCreate执行前、或者Fragment的onAttach到onCreate阶段完成初始化,运行时动态初始化会触发崩溃
  • 原有onActivityResult中对应谷歌登录请求码的逻辑可以直接迁移到上述launcher的回调中,不需要调整业务逻辑
  • 如果项目中找不到registerForActivityResult方法,请升级androidx.activity和androidx.fragment依赖到1.2.0及以上版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 02:00:00