SMS 检索器 api android 在 vi​​vo v15 pro、redmi note 4 中不起作用

Mat*_*anG 23 android kotlin sms-retriever-api

我已经使用此处的指南在我的应用程序中成功实现了 SMS 检索器。我的代码工作正常,并且 otp 在许多设备中自动填充,但有些设备如 vivo v15 pro、redmi note 4 它不起作用(BroadcastReceiver 的 onReceive() 没有被触发)。我在这里附上了我的代码。检查并告诉我您是否有任何解决方案。谢谢

清单文件

     <receiver
            android:name=".sms.SMSRetrieverBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
        <intent-filter>
            <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

SMSRetrieverBroadcastReceiver.kt

   class SMSRetrieverBroadcastReceiver : BroadcastReceiver() {



companion object{
    private var otpReceiver: OtpReceiver? = null
    fun initOTPListener(receiver: OtpReceiver) {
        this.otpReceiver = receiver
    }
}

override fun onReceive(context: Context, intent: Intent) {
    if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
        val extras = intent.extras
        val status = extras!!.get(SmsRetriever.EXTRA_STATUS) as Status

        when (status.statusCode) {
            CommonStatusCodes.SUCCESS -> {
                // Get SMS message contents
                var otp: String = extras.get(SmsRetriever.EXTRA_SMS_MESSAGE) as String
                Timber.d("OTP_Message "+otp)
              if(otpReceiver != null) {
                    otpReceiver!!.onOTPReceived(otp)
                }
            }

            CommonStatusCodes.TIMEOUT -> {
                // Waiting for SMS timed out (5 minutes)
                // Handle the error ...
                if(otpReceiver != null) {
                    otpReceiver!!.onOTPTimeOut()
                }
        }
    }
}}
Run Code Online (Sandbox Code Playgroud)

主活动.kt

fun startListeningForSMS() {
    SMSRetrieverBroadcastReceiver.initOTPListener(this)
    startSmsListener()
}


private fun startSmsListener() {
    val client = SmsRetriever.getClient(mContext)
    val task = client.startSmsRetriever()
    task.addOnSuccessListener {
        Timber.d("Success")
    }

    task.addOnFailureListener {
        Timber.d("Failed")
    }
}

override fun onOTPReceived(otp: String) {
    setReceivedOtp(otp)
}

override fun onOTPTimeOut() {
    setReceivedOtp(null)
}
Run Code Online (Sandbox Code Playgroud)

Him*_*ary 0

您可以检查一下这个意图过滤器操作吗:

 <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
Run Code Online (Sandbox Code Playgroud)