广播接收器不适用于SMS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了广播接收器不适用于SMS相关的知识,希望对你有一定的参考价值。
首先,我已经搜索了可能的解决方案,尝试了一切,但它仍然无效。我肯定错过了什么。
我正在尝试创建一个接收/读取和写入SMS的应用程序。写部分工作正常,我的广播接收器只是没有捕捉广播。
androidManifest.xml中
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
...
<receiver android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
SMS receiver.Java
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "ON RECEIVE BROADCAST", Toast.LENGTH_LONG).show();
Log.d("ON ","RECEIVE");
Bundle bundle = intent.getExtras();
Object[] messages = (Object[]) bundle.get("pdus");
SmsMessage[] sms = new SmsMessage[messages.length];
// Create messages for each incoming PDU
for (int n = 0; n < messages.length; n++) {
sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
}
for (SmsMessage msg : sms) {
Log.e("RECEIVED MSG",":"+msg.getMessageBody());
// Verify if the message came from our known sender
}
}
没有触发Logs或Toast。
尝试改变清单上的行动到android.intent.action.AIRPLANE_MODE
只是为了测试声明并收到广播,只是不适用于短信。
更新
尝试使用另一部手机并且工作正常。一定是因为我使用的是Handcent短信,还有一些如何阻止广播。无论哪种方式,我需要它独立于安装的应用程序在每个手机上工作。
尝试将接收器声明如下:
<receiver android:name=".SmsReceiver" android:permission="android.permission.BROADCAST_SMS" android:exported="true">
<intent-filter android:priority="5822" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
这对我来说很好,我只添加了一个标志来告诉这个receiver is exported
。
编辑:我忘了将优先级添加到intent过滤器。使用高数字作为优先级。
找到了一个回答我怀疑的话题:Suppress / Block BroadcastReceiver in another app。
即使优先级设置为maximum possible (999),如果另一个应用程序具有相同的优先级,在这种情况下是Handcent SMS应用程序,将接收广播的第一个应用程序是用户首次安装的应用程序。
在我的情况下是Handcent短信,因为它在接收时中止广播,我的应用程序没有收到任何东西。
我已经尝试了所有的东西,它在许多手机上工作,但不是我的,我试图在朗姆酒时间请求许可(我有nexus 5版本23)。它对我有用。
正如@Maxim Toyberman所说,你需要在运行时请求许可(如https://stackoverflow.com/a/35972161/3427883所述)
基本上你需要确保你有权接收以下的短信屁股
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECEIVE_SMS}, 1);
以上是关于广播接收器不适用于SMS的主要内容,如果未能解决你的问题,请参考以下文章
无法添加窗口 - 令牌 null 不适用于广播接收器的 OnReceive 内的应用程序