Android端Firebase Facebook Auth调用signInWithCredential空指针问题
问题根因排查与修复方案
核心错误(直接触发空指针的原因)
你在handleFacebookAccesToken函数中直接将mAuth赋值为null:
val mAuth: FirebaseAuth? = null
当你把mAuth?.signInWithCredential改成!!调用时,相当于强行对null值执行方法调用,自然会直接抛出空指针异常。
其他潜在问题
- 滥用非空断言
!!:多处代码直接用!!强行调用可空类型的属性/方法,没有做空校验,任意一处为空都会触发崩溃,涉及的位置包括:accessToken!!.tokenresult!!.accessTokentask.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
相关产品推荐
相关产品推荐

