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

Android端Firebase Facebook Auth调用signInWithCredential空指针问题

问题根因排查与修复方案

核心错误(直接触发空指针的原因)

你在handleFacebookAccesToken函数中直接将mAuth赋值为null:

val mAuth: FirebaseAuth? = null

当你把mAuth?.signInWithCredential改成!!调用时,相当于强行对null值执行方法调用,自然会直接抛出空指针异常。

其他潜在问题

  • 滥用非空断言!!:多处代码直接用!!强行调用可空类型的属性/方法,没有做空校验,任意一处为空都会触发崩溃,涉及的位置包括:
    • accessToken!!.token
    • result!!.accessToken
    • task.exception!!.toString()
    • FirebaseAuth.getInstance().currentUser!!
    • callbackManager?.onActivityResult中用到的callbackManager也可能未初始化
  • 逻辑执行问题:原代码中mAuth为null,即使不用!!,?.调用后后续的登录逻辑也完全不会执行,登录流程永远不会生效。

修复方案

1. 修复handleFacebookAccesToken代码

private fun handleFacebookAccesToken(accessToken: AccessToken?) {
    // 先校验参数非空
    if (accessToken == null) {
        Toast.makeText(this, "Facebook授权信息为空", Toast.LENGTH_LONG).show()
        return
    }
    val progressDialog = ProgressDialog(this@MainActivity)
    progressDialog.setTitle("Sign Up with Facebook")
    progressDialog.setMessage("Please wait, this may take a while...")
    progressDialog.setCanceledOnTouchOutside(false)
    progressDialog.show()

    val credential = FacebookAuthProvider.getCredential(accessToken.token)
    // 正确获取FirebaseAuth实例,不要赋值为null
    val mAuth = FirebaseAuth.getInstance()
    mAuth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            progressDialog.dismiss()
            if (task.isSuccessful) {
                val user = mAuth.currentUser
                if (user != null) {
                    val intent = Intent(this, Activity2::class.java)
                    startActivity(intent)
                    //updateUI(user)
                } else {
                    Toast.makeText(this, "获取用户信息失败", Toast.LENGTH_LONG).show()
                    mAuth.signOut()
                }
            } else {
                val message = task.exception?.toString() ?: "未知登录错误"
                Toast.makeText(this, "Error: $message", Toast.LENGTH_LONG).show()
                mAuth.signOut()
            }
        }
}

2. 修复Facebook登录回调的空校验

override fun onSuccess(result: LoginResult?) {
    // 先判空再调用
    result?.accessToken?.let {
        handleFacebookAccesToken(it)
    } ?: run {
        Toast.makeText(applicationContext, "登录结果为空", Toast.LENGTH_LONG).show()
    }
}

3. 确认callbackManager初始化

在Activity的onCreate方法中添加初始化代码,避免callbackManager为空:

private var callbackManager: CallbackManager? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 初始化callbackManager
    callbackManager = CallbackManager.Factory.create()
    // 其余原有初始化逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:15:06