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

使用Firebase实现Facebook登录时如何用ActivityResultLauncher替代onActivityResult

实现方案

完整替换代码

你只需要新增ActivityResultLauncher接收登录返回结果,删除原有onActivityResult重写逻辑即可,原有业务逻辑无需修改:

class LoginActivity : AppCompatActivity() {
    private val TAG = "FacebookLogin"
    // 保留原有CallbackManager实例
    private val callbackManager = CallbackManager.Factory.create()

    // 新增:注册Facebook登录结果接收 launcher
    private val facebookLoginLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        // 将返回结果传递给Facebook回调管理器处理
        callbackManager.onActivityResult(result.resultCode, result.resultCode, result.data)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        val buttonFacebookLogin = findViewById<LoginButton>(R.id.buttonFacebookLogin)
        buttonFacebookLogin.setReadPermissions("email", "public_profile")
        // 原有登录回调逻辑保持不变
        buttonFacebookLogin.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
            override fun onSuccess(loginResult: LoginResult) {
                Log.d(TAG, "facebook:onSuccess:$loginResult")
                handleFacebookAccessToken(loginResult.accessToken)
            }

            override fun onCancel() {
                Log.d(TAG, "facebook:onCancel")
            }

            override fun onError(error: FacebookException) {
                Log.d(TAG, "facebook:onError", error)
            }
        })
    }

    // 注意:删除原有重写的onActivityResult方法即可,不需要再保留

    private fun handleFacebookAccessToken(token: AccessToken) {
        // 原有Firebase认证逻辑完全不变
        val credential = FacebookAuthProvider.getCredential(token.token)
        Firebase.auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // 登录成功后续处理
                    val user = Firebase.auth.currentUser
                } else {
                    Toast.makeText(baseContext, "Facebook认证失败", Toast.LENGTH_SHORT).show()
                }
            }
    }
}

注意事项

  • 如果你使用的是12.0.0及以上版本的Facebook SDK,官方已经原生支持Activity Result API,无需手动创建launcher,直接调用LoginManager的对应注册回调方法即可
  • 如果你用自定义按钮替代Facebook官方的LoginButton,只需要在按钮点击事件中调用facebookLoginLauncher.launch(loginIntent)启动登录流程即可

内容的提问来源于stack exchange,提问作者Lộc Trần Phước

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:54:03