我正在处理的应用程序允许用户允许应用程序读取确认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>
Run Code Online (Sandbox Code Playgroud)
但是,从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);
}
Run Code Online (Sandbox Code Playgroud)
在接收Manifest.permission.READ_SMS的许可时执行此代码块.SmsReceiver类扩展了BroadcastReceiver并覆盖了它的onReceive()方法.
在这里,我有几个问题:
我测试了这个实现,并在我的SmsReceiver中的onReceive()方法上设置了断点.当SMS到达时,应用程序永远不会进入onReceive()方法.为什么会这样?
我按照Android Developer网站上描述的方式实例化我的IntentFilter,即使用ConnectivityManager.CONNECTIVITY_ACTION操作.我知道SmsReceiver有效,因为onReceive()中的断点总是在接收器注册时被击中.但是,该操作仅仅是CONNECTIVITY_ACTION.SMS_RECEIVED_ACTION永远不会被接收器捕获.是否绝对有必要使用此操作实例化IntentFilter,还是可以将其删除?
还有其他我想念的东西会导致我的接收器没有收到到达的短信吗?
android broadcastreceiver android-broadcastreceiver android-8.0-oreo