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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:01