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

Firebase同设备手机号认证失败报Realtime Database空指针问题咨询

问题根因

你的问题是Firebase手机号认证的自动校验特性触发的逻辑漏洞:
当认证手机号和运行应用的设备SIM卡一致,或设备可直接读取到发送的OTP短信时,Firebase会触发自动校验,直接回调onVerificationCompleted方法,无需用户手动输入OTP;跨设备认证时无法触发自动校验,必须用户手动输OTP走你写的手动校验逻辑,所以跨设备运行正常。

你代码里的onVerificationCompleted回调存在严重逻辑缺失:拿到认证凭证后没有执行登录逻辑,直接跳转到了MainActivity,此时Firebase用户并未完成登录,MainActivity第40行大概率是直接强制获取了未初始化的当前登录用户对象(比如FirebaseAuth.getInstance().currentUser!!的写法),导致空指针崩溃,你误以为是实时数据库抛出的异常,实际崩溃发生在MainActivity的初始化逻辑中。


修复方案

1. 修正OtpVerify.kt的自动校验回调逻辑

把onVerificationCompleted方法改成调用你已经写好的登录校验逻辑,和手动输OTP走相同的流程:

override fun onVerificationCompleted(credential: PhoneAuthCredential) {
    // 不要直接跳转,执行登录+数据库校验逻辑
    signInWithPhoneAuthCredential(credential)
}

2. 修复MainActivity的空指针风险

找到MainActivity第40行的代码,所有获取当前登录用户的位置都要加非空判断,不要用!!强制取值:

// 错误写法示例
val uid = FirebaseAuth.getInstance().currentUser!!.uid

// 修正后写法
val currentUser = FirebaseAuth.getInstance().currentUser
if (currentUser != null) {
    val uid = currentUser.uid
    // 正常执行业务逻辑
} else {
    // 用户未登录,跳回认证页重新走登录流程
    startActivity(Intent(this, OtpVerify::class.java))
    finish()
}

3. 额外优化(可选)

你的build.gradle存在重复依赖问题:多次引入不同版本的material design库,同时混用了带版本号的Firebase依赖和Firebase BoM版本管理,建议清理重复依赖,避免后续出现兼容性问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:36:09