Firebase短信验证问题:验证码无法赋值给incomingCode变量
问题解决思路
核心原因
onVerificationCompleted的触发分两种场景:
- 场景1:设备通过Google Play服务自动读取并验证短信,此时
PhoneAuthCredential.smsCode本身就是null,但该凭据已经是有效的验证凭证。 - 场景2:设备无法自动验证,此时会收到短信验证码,
smsCode才会有值。
你直接强制取smsCode!!,在场景1下要么触发空指针异常,要么导致incomingCode为空,而且手动对比验证码的逻辑本身不符合Firebase验证的标准流程。
修正方案
1. 调整onVerificationCompleted逻辑
直接使用收到的credential完成登录验证,无需提取验证码:
override fun onVerificationCompleted(credential: PhoneAuthCredential) { // 用凭据直接完成验证登录 auth.signInWithCredential(credential) .addOnCompleteListener(requireActivity()) { task -> if (task.isSuccessful) { Toast.makeText(activity, "验证成功", Toast.LENGTH_SHORT).show() // 这里可以添加跳转主页面等后续操作 } else { Toast.makeText(activity, "验证失败", Toast.LENGTH_SHORT).show() } } }
2. 修正手动输入验证码的逻辑
用户输入验证码后,不要对比incomingCode,而是用verificationID和输入的验证码创建凭据,交给Firebase验证:
view.buttonTelKodIleri.setOnClickListener { val inputCode = view.editTextOnayKodu.text.toString().trim() if (inputCode.isNotEmpty()) { val credential = PhoneAuthProvider.getCredential(verificationID, inputCode) auth.signInWithCredential(credential) .addOnCompleteListener(requireActivity()) { task -> if (task.isSuccessful) { Toast.makeText(activity,"ilerle",Toast.LENGTH_SHORT).show() } else { Toast.makeText(activity,"验证码错误",Toast.LENGTH_SHORT).show() } } } else { Toast.makeText(activity,"请输入验证码",Toast.LENGTH_SHORT).show() } }
3. 移除冗余变量
删除var incomingCode ="",因为现在不需要存储自动获取的验证码,直接依赖Firebase的验证流程即可。
4. 完善异常处理
给onVerificationFailed添加错误提示,方便调试:
override fun onVerificationFailed(e: FirebaseException) { Toast.makeText(activity, "验证失败:${e.message}", Toast.LENGTH_SHORT).show() }
完整修正后的关键代码片段
class EnterPhoneCodeFragment : Fragment() { var gelenTelNo = "" lateinit var callbacks: PhoneAuthProvider.OnVerificationStateChangedCallbacks private lateinit var auth : FirebaseAuth var verificationID="" override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.fragment_enter_phone_code, container, false) view.textViewKullaniciTelNo.setText(gelenTelNo) auth= FirebaseAuth.getInstance() setupCallBack() view.buttonTelKodIleri.setOnClickListener { val inputCode = view.editTextOnayKodu.text.toString().trim() if (inputCode.isNotEmpty()) { val credential = PhoneAuthProvider.getCredential(verificationID, inputCode) auth.signInWithCredential(credential) .addOnCompleteListener(requireActivity()) { task -> if (task.isSuccessful) { Toast.makeText(activity,"ilerle",Toast.LENGTH_SHORT).show() } else { Toast.makeText(activity,"验证码错误",Toast.LENGTH_SHORT).show() } } } else { Toast.makeText(activity,"请输入验证码",Toast.LENGTH_SHORT).show() } } val options = PhoneAuthOptions.newBuilder(auth) .setPhoneNumber(gelenTelNo) .setTimeout(60L, TimeUnit.SECONDS) .setActivity(requireActivity()) .setCallbacks(callbacks) .build() PhoneAuthProvider.verifyPhoneNumber(options) return view } private fun setupCallBack() { callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() { override fun onVerificationCompleted(credential: PhoneAuthCredential) { auth.signInWithCredential(credential) .addOnCompleteListener(requireActivity()) { task -> if (task.isSuccessful) { Toast.makeText(activity,"验证成功",Toast.LENGTH_SHORT).show() } else { Toast.makeText(activity,"验证失败",Toast.LENGTH_SHORT).show() } } } override fun onVerificationFailed(e: FirebaseException) { Toast.makeText(activity,"验证失败:${e.message}",Toast.LENGTH_SHORT).show() } override fun onCodeSent(verificationId: String, token: PhoneAuthProvider.ForceResendingToken) { verificationID = verificationId } } } // 其余EventBus相关代码保持不变 }
内容的提问来源于stack exchange,提问作者Yigit Kula
相关产品推荐
相关产品推荐

