使用abortBroadcast()无法阻止短信?

时间:2012-06-29 09:58:12

标签: android sms broadcastreceiver messaging

我正在开发一个短信拦截器应用程序,我正在使用广播接收器和abortBroadcast()方法 - 正如许多人们在这里建议的那样 - 以防止邮件到达收件箱并提醒用户。但在我的情况下,当我使用模拟器发送短信时,短信将不会被阻止,并且到达收件箱,我也收到错误:

06-29 09:19:05.854: E/BroadcastReceiver(868): BroadcastReceiver trying to return result during a non-ordered broadcast

它不会在模拟器中终止应用程序,但是当我在手机上测试时,应用程序会被终止。

是的,我已将接收者的优先级设置为较高的数字,并在此处查询权限:

<receiver android:name="SMSMonitor">  
    <intent-filter android:priority="9999999">
        <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> 
    </intent-filter>  
</receiver>

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY"/>

最后,这是我的代码:

public class SMSMonitor extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        boolean isOn = loadState(context,"isOn");// is blocking enabled?
        Bundle bundle = intent.getExtras();
        Object messages[] = (Object[]) bundle.get("pdus");
        SmsMessage smsMessage[] = new SmsMessage[messages.length];
        String mAddress;
        String mBody;
        String mTime;
        if(isOn){
            // if spam blocking is enabled.
            for (int n = 0; n < messages.length; n++) {
                smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
                mAddress=smsMessage[n].getDisplayOriginatingAddress().toString();

                mBody=smsMessage[n].getDisplayMessageBody().toString();

                mTime=getTime();
                if(isBlackList( mAddress)== true) {
                    this.addLog(mAddress, mBody, mTime);
                    abortBroadcast();
                    Toast.makeText(context,"Incoming SMS was blocked and logged.", Toast.LENGTH_LONG).show();  
                }
            }
        }
    }
}

有人建议here无法中止短信广播,因为Android不会允许。但是我看到很多人建议使用abortBroadcast()来阻止短信,而且我也知道市场上一些实际上可以阻止短信的短信拦截器应用程序。我不知道他们是否正在使用abortbroadcast。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

绝对可以这个,你写的代码完全没问题,

尝试从<intent-filter android:priority="9999999"><intent-filter android:priority="99999999">的优先级,优先级高于您提供的优先级,然后尝试检查。

答案 1 :(得分:1)

“从Android 1.6开始,传入的短信广播(android.provider.Telephony.SMS_RECEIVED)作为”有序广播“传送 - 这意味着您可以告诉系统哪些组件应首先接收广播。”我正在使用Android 1.5而且广播没有订购!

感谢这位家伙link

答案 2 :(得分:1)

它是否显示接收器的Toast?可能您的Receiver未在Manifest中正确注册。

尝试改变,

<receiver android:name="SMSMonitor">

<receiver android:name=".SMSMonitor">