使用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
相关产品推荐
相关产品推荐

