实现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
相关产品推荐
相关产品推荐

