<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()方法。
我有几个问题:
我已经测试了这个实现,并在我的SmsReceiver的onReceive()方法中设置了断点。当短信到达时,应用程序从未进入onReceive()方法。这可能是为什么?
我按照Android开发者网站上描述的方式实例化了IntentFilter,即使用ConnectivityManager.CONNECTIVITY_ACTION操作。我知道SmsReceiver可以工作,因为在注册接收器时总是会命中onReceive()中的断点。然而,操作仅为CONNECTIVITY_ACTION。SMS_RECEIVED_ACTION从未被接收器捕获。是否绝对必要使用此操作来实例化IntentFilter,或者可以省略此操作?
是否还有其他遗漏的内容可能导致接收器无法捕获到到达的短信?
SMS_RECEIVED
在广播白名单中,因此您使用的原始方法<intent-filter>
仍然有效。 - CommonsWareSMS_RECEIVED
广播时没有遇到任何问题。我记录了一条消息到LogCat,消息显示出来了。 - CommonsWare