在查阅了多个资源和问题后,我仍然面临着检测传入短信的问题。
下面的代码显示了基本内容:
广播接收器类,在onReceive中显示toast
public class IncomingSms extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "something received", Toast.LENGTH_SHORT).show();
}
}
具有注册接收器和权限的简单清单文件
<application
<receiver
android:name=".IncomingSms"
android:permission="android.permission.BROADCAST_SMS"
android:exported="true">
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
上面的代码声明并注册了接收器,并具有适当的权限。此外,优先级设置为MAX_INT或2147483647。
我的设备是Nexus 6P,安装了默认的Messenger应用程序(我还尝试过Hangouts)。该应用程序仍然不显示我的toast。在旧的三星设备上尝试后,toast可以正常打印。
优先级问题
我在6P上安装了一个名为Manifest Viewer的应用程序,它允许我查看设备上安装的应用程序的manifest.xml。我检查了Messenger和Hangouts的清单,针对SMS标签的接收器,并发现它们都指定了优先级2147483647。这似乎是这两个信使应用程序最大化了优先级,并且一旦它们消耗了消息,它们就不允许其他应用程序介入。请注意,这些是原始的Google应用程序,而不是第三方应用程序。
此时,我非常困惑:
他们为什么要这样做?
如何绕过它?
READ_SMS
权限,但没有请求RECEIVE_SMS
权限。尽管我遵循了Android Authority上的教程! - Magnus