接收广播意图时出错(act=com.google.android.gms.auth.phone.SMS_RETRIEVED)

时间:2021-04-21 13:20:10

标签: android firebase google-signin one-time-password sms-retriever-api

我在我的应用中实现 SMS 检索器同意 API 时收到此“接收广播意图时出错”。 这是我的片段中的广播接收器代码:

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
                        Log.d("sms", "in success")
                        val consentIntent = extras?.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
                        try {
                            Log.d("sms", "in success 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 ...
                            Log.d("sms", "Exception")
                        }
                    }
                    CommonStatusCodes.TIMEOUT -> {
                        // Time out occurred, handle the error.
                        Log.d("sms", "Timeout")
                    }
                }
            }
        }
    }

首先我启动监听器,在监听器成功后我注册了广播接收器

这是我的听众

private fun startSmsListener(){
        val task = context?.let { SmsRetriever.getClient(it).startSmsUserConsent(null /* or null */) }
        task?.addOnSuccessListener {
            showToast("Sms auto detection started")
            Log.d("sms", "Sms auto detection started")
            val intentFilter = IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)
            context?.registerReceiver(smsVerificationReceiver, intentFilter)
        }
        task?.addOnFailureListener {
            showToast("Sms auto detection failed")
            Log.d("sms", "Sms auto detection failed")
        }
    }

最后我在 onActivityResult 中得到结果

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.
                    //val oneTimeCode = parseOneTimeCode(message) // define this function
                    Log.d("OTP detected", message)
                    //txt_otp.setText(oneTimeCode)

                    // send one time code to the server
                } else {
                    // Consent denied. User can type OTC manually.
                }
        }
    }

0 个答案:

没有答案