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