【问题标题】:firebase auth with phone number带有电话号码的firebase身份验证
【发布时间】:2021-04-03 05:36:21
【问题描述】:

我正在使用 Firebase,我正在尝试使用电话身份验证注册用户。

这是我的完整活动代码

class RegisterActivity : AppCompatActivity(){
 private val auth = FirebaseAuth.getInstance()
    private val timeoutSeconds = 60L
    private lateinit var storedVerificationId: String
    private lateinit var resendToken: PhoneAuthProvider.ForceResendingToken

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)
        registerbtn.setOnClickListener { registerButtonClicked() }
        verifybtn.setOnClickListener { verifyButtonClicked() }
    }
fun registerButtonClicked() {
        registerPhoneNumber(editTextPhone.text.toString())
    }
private fun verifyButtonClicked() {
       verifyUser(editTextPhone.text.toString())
    }
private fun registerPhoneNumber(phoneNumber: String) {
        val options = PhoneAuthOptions.newBuilder(auth)
            .setPhoneNumber(phoneNumber) 
            .setTimeout(timeoutSeconds, TimeUnit.SECONDS)
            .setActivity(activity)           
            .setCallbacks(callbacks)  
            .build()
        PhoneAuthProvider.verifyPhoneNumber(options)
    }

private val callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            signInWithPhoneAuthCredential(credential)
        }

        override fun onVerificationFailed(e: FirebaseException) {
                   }

        override fun onCodeSent(
            verificationId: String,
            token: PhoneAuthProvider.ForceResendingToken
        ) {
            storedVerificationId = verificationId
            resendToken = token
        }
    }

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
        auth.signInWithCredential(credential)
            .addOnCompleteListener(activity) { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "signInWithCredential:success")
                } 
            }
    }

fun verifyUser(verificationCode: String) {
        val credential = PhoneAuthProvider.getCredential(storedVerificationId, verificationCode)
        signInWithPhoneAuthCredential(credential)
    }

我得到了一个异常,storedVerificationId 没有设置,即使我已经在onCodeSent 中设置了它 我在这里做错了什么?我遵循的流程是否正确?

【问题讨论】:

  • 我们无法在此处看到 storedVerificationId 的声明位置,因此我们无法知道如何解决此问题。错误消息来自 Kotlin 编译器,与 Firebase 的工作方式无关。请编辑问题以关注处理storedVerificationId 的源代码。它应该包含一个 complete, minimal example 的代码,它不能按您期望的方式工作。
  • 它们在类中被定义为 lateint var,我将它们设置在 onCodeSent 中。更新了问题。 @DougStevenson
  • 我根本看不到任何 lateinit 变量。请编辑问题以显示complete minimal code。不要只是描述它 - 将代码复制到您的问题中,以便我们可以看到编译器看到的内容。
  • 对此感到抱歉。我刚刚更新了问题并发布了整个活动@DougStevenson

标签: android firebase kotlin firebase-authentication


【解决方案1】:

Kotlin 运行时向您提供此消息,因为它发现 storedVerificationId 在用于 verifyUser 之前没有被赋予非空值。

您可能只想从中删除lateinit 关键字,并允许初始值为空。您必须在使用前检查 null 以确保它已设置。

    private var storedVerificationId: String? = null


    fun verifyUser(verificationCode: String) {
        if (storedVerificationId != null) {
            val credential = PhoneAuthProvider.getCredential(storedVerificationId, verificationCode)
            signInWithPhoneAuthCredential(credential)
        }
        else {
            // decide what you want to do if it hasn't been given a value yet.
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多