【发布时间】:2018-02-14 14:28:30
【问题描述】:
我正在开发的一个应用程序允许用户允许该应用程序读取确认短信的内容以自行输入验证码。对于使用早于 Oreo (API 26) 的操作系统的所有设备,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() 方法。
在这里,我有几个问题:
我已经测试了这个实现,并在我的 SmsReceiver 中的 onReceive() 方法上设置了断点。当 SMS 到达时,应用程序永远不会进入 onReceive() 方法。为什么会这样?
我按照 Android 开发者网站上描述的方式实例化了我的 IntentFilter,即使用 ConnectivityManager.CONNECTIVITY_ACTION 操作。我知道 SmsReceiver 有效,因为 onReceive() 中的断点总是在接收者注册时命中。但是,该操作仅仅是 CONNECTIVITY_ACTION。 SMS_RECEIVED_ACTION 永远不会被接收者捕获。用这个动作实例化 IntentFilter 是绝对必要的,还是可以省略?
还有什么我遗漏的东西可能导致我的接收器无法接收到到达的 SMS?
【问题讨论】:
-
SMS_RECEIVED是 on the broadcast whitelist,因此您使用<intent-filter>的原始方法应该仍然有效。 -
我也这么认为,但不知何故,尽管该实现适用于所有以前的操作系统 :( 。一般来说,在 Oreo 上接收短信是否会破坏这一点?
-
“它不知何故没有,即使实现适用于所有以前的操作系统”——这很奇怪。我没有看到任何关于它不起作用的问题,我原以为如果它被打破了,现在有人会抱怨。您在什么设备上进行测试?
-
到目前为止,我用过 HMD Global (Nokia 8) 和 Nexus,都是 Oreo。我还知道一个 OnePlus 3,也有 Oreo,它无法在 onReceive 中捕捉到短信。基本上所有 API 26 及以上的东西都不会捕捉到它,下面的所有东西都会捕捉到它。
-
三星 S8 也是如此。这就是我所做的让它只工作ONCE:
Turned SMS permission off and on after some seconds manually and it worked.你们中有人解决了这个问题吗?
标签: android broadcastreceiver android-broadcastreceiver android-8.0-oreo