android - 使用 Firebase Auth 进行身份验证时,短信验证码请求失败

标签 android firebase kotlin firebase-authentication sms-retriever-api

使用 Firebase Auth 进行身份验证时,我想自动输入通过 SMS 接收的代码。我能够接收短信并手动完成身份验证过程,但是当我使用 SmsRetriever 时,应用程序崩溃,然后显示底部工作表对话框。
这是出现在 Logcat 中的所有内容:

E/FirebaseAuth: [SmsRetrieverHelper] SMS verification code request failed: unknown status code: 17010 null


用户输入电话号码的 fragment 中的代码:
private val SMS_CONSENT_REQUEST = 2  // Set to an unused request code

    private val smsVerificationReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
                val extras = intent.extras
                val smsRetrieverStatus = extras?.get(SmsRetriever.EXTRA_STATUS) as Status

                when (smsRetrieverStatus.statusCode) {
                    CommonStatusCodes.SUCCESS -> {
                        // Get consent intent
                        val consentIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
                        try {
                            // Start activity to show consent dialog to user, activity must be started in
                            // 5 minutes, otherwise you'll receive another TIMEOUT intent
                            startActivityForResult(consentIntent, SMS_CONSENT_REQUEST)
                        } catch (e: ActivityNotFoundException) {
                            // Handle the exception ...
                        }
                    }
                    CommonStatusCodes.TIMEOUT -> {
                        // Time out occurred, handle the error.
                    }
                }
            }
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val task = SmsRetriever.getClient(requireActivity()).startSmsUserConsent(null)
        val intentFilter = IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)
        requireActivity().registerReceiver(smsVerificationReceiver, intentFilter)
    }
    
    override fun sendSms() {
        showProgressBar(true)
        SmsRetriever.getClient(requireActivity()).startSmsUserConsent(presenter.getNumber())
        val options = PhoneAuthOptions.newBuilder(auth)
            .setPhoneNumber(presenter.getNumber())
            .setTimeout(58L, TimeUnit.SECONDS)
            .setActivity(requireActivity())
            .setCallbacks(callbacks)
            .build()
        PhoneAuthProvider.verifyPhoneNumber(options)
    }

    override fun onDestroy() {
        super.onDestroy()
        requireContext().unregisterReceiver(smsVerificationReceiver)
    }
这是 fragment 中的代码,用户必须在其中输入代码:
 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            // ...
            SMS_CONSENT_REQUEST ->
                // Obtain the phone number from the result
                if (resultCode == Activity.RESULT_OK && data != null) {
                    // Get SMS message content
                    val message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE)
                    // Extract one-time code from the message and complete verification
                    // `message` contains the entire text of the SMS message, so you will need
                    // to parse the string.
                    message?.let { presenter.parseSms(it) }
                    // send one time code to the server
                } else {
                    // Consent denied. User can type OTC manually.
                }
        }
    }

最佳答案

打印您的 FirebaseAuthException 错误以查看发生了什么。如果您使用真实电话号码进行开发并一次又一次地使用它,Firebase 可能会暂时阻止该设备。
解决方案:添加一个带有密码的测试电话号码并使用它。

关于android - 使用 Firebase Auth 进行身份验证时,短信验证码请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65792764/

相关文章:

android - 如何在Android中向主题发送消息

java - 如何使用外部库在 java 上正确工作但在 Android Activity 上不工作

android - android 4.1.2 中的 Webview 在缩放时以黑色闪烁

android - Firebase 动态链接随机打开 playstore,但应用已安装

kotlin - 如何在 Kotlin 中获取 Int 的二进制表示

java - 恢复旧项目但明显合并失败?

kotlin - 不区分大小写的时候

android - 在 GradientDrawable Android 上设置描边

java - 它可能在 url 中发送数组

node.js - res.cookie(名称,值);不设置 cookie (Express/NodeJs)