Oreo BroadcastReceiver短信收到不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oreo BroadcastReceiver短信收到不起作用相关的知识,希望对你有一定的参考价值。

我正在处理的应用程序允许用户允许应用程序读取确认SMS的内容以自行输入验证码。对于使用早于Oreo(API 26)的OS的所有设备,BroadcastReceiver的实现正常工作并允许正确接收SMS。通过这个实现,我的意思是将接收器对象放在androidManifest中。

<receiver android:name=".SmsReceiver">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
</receiver>

但是,从Oreo开始,必须将BroadcastReceivers显式注册到适当的上下文。我已经实现了如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            smsReceiver = new SmsReceiver();
            IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
            intentFilter.addAction(Telephony.Sms.Intents.DATA_SMS_RECEIVED_ACTION);
            this.registerReceiver(smsReceiver, intentFilter);
        }

在接收Manifest.permission.READ_SMS的许可时执行此代码块。 SmsReceiver类扩展了BroadcastReceiver并覆盖了其onReceive()方法。

在这里,我有几个问题:

  1. 我测试了这个实现,并在我的SmsReceiver中的onReceive()方法上设置了断点。当SMS到达时,应用程序永远不会进入onReceive()方法。为什么会这样?
  2. 我按照Android Developer网站上描述的方式实例化我的IntentFilter,即使用ConnectivityManager.CONNECTIVITY_ACTION操作。我知道SmsReceiver有效,因为onReceive()中的断点总是在接收器注册时被击中。但是,该操作仅仅是CONNECTIVITY_ACTION。 SMS_RECEIVED_ACTION永远不会被接收器捕获。是否绝对有必要使用此操作实例化IntentFilter,还是可以将其删除?
  3. 还有其他我想念的东西可能导致我的接收器没有收到到达的短信吗?
答案

以前我要求-Manifest.permission.READ_SMS没有用,然后我将权限更改为--Manifest.permission.RECEIVE_SMS然后它开始在oreo工作,我也在清单中指定了接收器我不知道是否有帮助不是,但这对我来说是一天

   public static void requestPermissionForReadSMS(Fragment fragment) {
    //        if (fragment.shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)) {
    //            Helpers.showRequestPermissionAlertDialog(fragment, fragment.getString(R.string.read_sms_permission), fragment.getString(R.string.permission_request));

    //        } else {
            fragment.requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS},
                    Constants.READ_SMS_PERMISSION);
   // }

        }
另一答案

对我来说这个作品:

private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},
        MY_PERMISSIONS_REQUEST_SMS_RECEIVE);

在获得许可后,在主要活动中提及上述代码。在那之后覆盖这个:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
            permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) {
                Log.d("TAG", "My permission request sms received successfully");
            }
 }

就这样。因此,现在不需要在手动几秒钟后关闭和打开SMS权限。

另一答案

手动几秒钟后关闭和打开SMS权限并且它有效。

另一答案

只需添加

android:permission="android.permission.BROADCAST_SMS"

在Manifest中的接收器标签。

如此理想的清单注册广播接收器: -

<receiver android:name=".receivers.SMSBroadCastReceiver"
        android:exported="true"
        android:permission="android.permission.BROADCAST_SMS">
        <intent-filter
            android:priority="2147483647">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
另一答案

@rohit sharma 给出的答案最初为我工作,但后来我也在各种设备上测试了我的应用程序,如oneplus,mi,oppo和vivo,并发现

1.On vivo,oppo和mi(有miui)设备有一种称为自动启动的东西,默认情况下是禁用的,所以SMS_RECIEVED_ACTION不起作用(这里的工作我的意思是启动应用程序或在sms_recieved后台运行任何服务)甚至被列入白名单从最近给出的隐性禁令清单中。

2.在oneplus设备上有电池优化功能,如果您的应用程序列出了电池优化(默认情况下为是),则SMS_RECIEVED_ACTION仅在您的应用处于前台或后台时,如果您的应用被杀或在电话之后才有效重新启动广播接收器不会工作。要使SMS_RECIEVD_ACTION正常工作,您必须从电池优化中删除应用程序。有关此内容的更多信息,您可以按照此主题进行操作here

以上是关于Oreo BroadcastReceiver短信收到不起作用的主要内容,如果未能解决你的问题,请参考以下文章

AlarmManager和BroadcastReceiver的LocalNotification未在Android O(oreo)中启动

Android初级教程短信防火墙

Android——BroadcastReceiver 广播 短信拦截

使用BroadcastReceiver监听系统接收的短信

手机收不到短信收不到验证码无法取件

BroadcastReceiver,用于在基于 Samsung-Android 的智能手机上接收短信