我工作的一个短信拦截应用,在我使用的广播接收器和abortBroadcast()方法 - 尽可能多的脂肪酶建议在这里 - 防止到达收件箱,并提醒用户的消息。 但对我来说,当我使用模拟器发送短信,SMS消息将不会阻挡,并到达收件箱中,我也得到一个错误:
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与否。
有任何想法吗?