我正在开发一个短信拦截器应用程序,其中我使用广播接收器和 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();
}
}
}
}
}
这里有人建议不能中止 SMS 广播,因为 Android 不允许。但是我在这里看到很多人建议使用 abortBroadcast() 来阻止短信,而且我知道市场上有一些短信拦截器应用程序实际上可以阻止短信。我不知道他们是否使用 abortbroadcast。
有任何想法吗?