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

