广播接收器不适用于SMS

时间:2013-10-21 16:54:33

标签: android broadcastreceiver

首先,我已经搜索了可能的解决方案,尝试了所有方法但它仍然无效。我一定错过了什么。

我正在尝试创建一个接收/读取和写入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>

SmsReceiver.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

        }
}

没有触发任何日志或祝酒词。

尝试将清单上的操作更改为android.intent.action.AIRPLANE_MODE只是为了测试声明并收到广播,这对短信不起作用。

已更新

尝试使用其他手机并且有效。一定是因为我使用的是Handcent短信,还有一些如何阻止广播。无论哪种方式,我都需要它独立于所安装的应用程序在每部手机上工作。

4 个答案:

答案 0 :(得分:4)

尝试将接收器声明如下:

<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过滤器。使用高数字作为优先级。

答案 1 :(得分:4)

找到一个回答我怀疑的主题:Suppress / Block BroadcastReceiver in another app

即使优先级设置为maximum possible (999),如果另一个应用具有相同的优先级,在本例中为Handcent SMS应用,将接收广播的第一个应用是用户首次安装的应用

在我的情况下是Handcent短信,因为它在接收时中止广播,我的应用程序没有收到任何内容。

答案 2 :(得分:1)

我已经尝试了所有的东西,它在许多手机上工作但不是我的,我试图在朗姆酒时间请求许可(我有nexus 5版本23)。 它对我有用。

答案 3 :(得分:-1)

如@Maxim Toyberman所说,您需要在运行时请求许可(如此处https://stackoverflow.com/a/35972161/3427883所述)

基本上,您需要确保您有权接收以下的SMS短信

        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECEIVE_SMS}, 1);