带有电话号码的 Firebase 身份验证

时间:2020-12-24 22:57:58

标签: android firebase kotlin firebase-authentication

我正在使用 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 中设置它 我在这里做错了什么?我遵循的流程是否正确?

1 个答案:

答案 0 :(得分: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.
        }
    }