首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >收到的Oreo BroadcastReceiver短信息无法正常工作

收到的Oreo BroadcastReceiver短信息无法正常工作
EN

Stack Overflow用户
提问于 2018-02-14 22:28:31
回答 6查看 8.6K关注 0票数 15

我正在开发的一个应用程序允许用户读取确认短信的内容,以便自己输入验证码。对于使用Oreo (API26)之前的操作系统的所有设备,BroadcastReceiver的实现工作正常,并允许正确接收短消息。在这个实现中,我的意思是将接收器对象放在AndroidManifest中。

代码语言:javascript
复制
<receiver android:name=".SmsReceiver">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
</receiver>

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

代码语言:javascript
复制
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()方法上设置了断点。当短信到达时,应用程序永远不会进入onReceive()方法。为什么会这样呢?
  2. 我用安卓开发者网站上描述的方式实例化了我的IntentFilter,即使用ConnectivityManager.CONNECTIVITY_ACTION操作。我知道SmsReceiver是有效的,因为onReceive()中的断点总是在注册接收器时命中。然而,该操作仅仅是CONNECTIVITY_ACTION。SMS_RECEIVED_ACTION永远不会被接收器捕获。是否绝对有必要使用此操作实例化IntentFilter ?或者可以省略此操作吗?
  3. 是否还有其他我遗漏的东西,可能导致我的接收器无法接收到到达的短信?
EN

回答 6

Stack Overflow用户

发布于 2018-05-28 09:20:58

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

代码语言:javascript
复制
   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);
   // }

        }
票数 20
EN

Stack Overflow用户

发布于 2018-08-24 21:47:44

对我来说,这是可行的:

代码语言:javascript
复制
private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},
        MY_PERMISSIONS_REQUEST_SMS_RECEIVE);

在授予权限后,在你的主活动中提到上面的代码。在此之后,覆盖以下内容:

代码语言:javascript
复制
@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");
            }
 }

这就是全部。所以现在不需要手动关闭和打开几秒钟后的短信权限。

票数 5
EN

Stack Overflow用户

发布于 2018-08-25 17:51:07

@rohit sharma 给出的答案最初对我有效,但后来我也在一加、mi、oppo和vivo等各种设备上测试了我的应用程序,并发现

1.在vivo、oppo和mi (有miui)设备上,有一种叫做自动启动的功能,默认情况下是禁用的,所以SMS_RECIEVED_ACTION无法工作(这里的工作指的是在sms_recieved上启动应用程序或在后台运行任何服务),甚至被列入了最近的隐式禁令名单。

2.在一加设备上有电池优化功能,如果你的应用程序被列为电池优化(这是默认情况下是),那么SMS_RECIEVED_ACTION将只在你的应用程序在前台或后台时工作,如果你的应用程序被杀死或手机重启后广播接收器不工作。要使SMS_RECIEVD_ACTION正常工作,您必须将应用程序从电池中移除optimizatons.For有关这方面的更多信息,您可以关注此帖子here

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48789572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档