Android Kotlin Firebase Google登录LifecycleOwner注册异常
问题根因
报错是因为registerForActivityResult的注册时机错误:
- 你把注册逻辑写在了按钮的点击监听回调里,用户点击按钮时Activity已经处于RESUMED状态,违反了Activity Result API的规则:LifecycleOwner必须在生命周期进入STARTED状态前完成注册调用
- 另外你的回调逻辑还有一处错误:获取登录结果时传入了自己创建的发起登录用Intent,实际上应该用系统返回的结果Intent,否则无法正确读取登录账号信息。
修复步骤
- 将
ActivityResultLauncher声明为Activity的成员变量,在onCreate初始化阶段完成注册,不要放在点击事件里注册 - 点击按钮时仅调用launch方法发起登录Intent
- 结果回调里使用回调参数返回的Intent解析Google登录结果
修复后完整代码
// 类成员位置声明启动器 private lateinit var googleSignInLauncher: ActivityResultLauncher<Intent> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) FirebaseApp.initializeApp(this) val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("替换为你自己的Web客户端ID") .requestEmail() .build() mGoogleSignInClient = GoogleSignIn.getClient(this, gso) firebaseAuth = FirebaseAuth.getInstance() // onCreate阶段注册,符合生命周期要求 googleSignInLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { // 注意:用result.data获取系统返回的Intent,不要用自己构造的signInIntent val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(result.data) handleResult(task) } } Signin.setOnClickListener { Toast.makeText(this, "Logging In", Toast.LENGTH_SHORT).show() val signInIntent = mGoogleSignInClient.signInIntent // 点击时仅发起启动,不做注册操作 googleSignInLauncher.launch(signInIntent) } }
注意事项
- 所有
registerForActivityResult注册操作都要在onCreate/类初始化阶段完成,禁止放在onStart、onResume、点击事件等生命周期进入STARTED之后的时机调用 - 不需要再重写已废弃的
onActivityResult方法,所有结果处理逻辑直接写在注册时传入的回调中即可 - 解析登录结果必须使用回调返回的
result.data,复用发起请求的Intent会导致解析失败
内容的提问来源于stack exchange,提问作者Kathy411
相关产品推荐
相关产品推荐

