【发布时间】:2012-06-30 20:43:46
【问题描述】:
我正在开发一个短信拦截器应用程序,其中我正在使用广播接收器和 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 不能中止 SMS 广播,因为 Android 不允许。但是我在这里看到很多人建议使用 abortBroadcast() 来阻止短信,而且我知道市场上有一些短信拦截器应用程序实际上可以阻止短信。我不知道他们是否在使用 abortbroadcast。
有什么想法吗?
【问题讨论】:
-
如果您有解决方案,请接受/UpVote 答案:)
-
我想我得到了答案,“从 Android 1.6 开始,传入的 SMS 消息广播 (android.provider.Telephony.SMS_RECEIVED) 以“有序广播”的形式传递——这意味着您可以告诉系统哪些组件应该首先接收广播。”我使用的是Android 1.5 并且广播是无序的!感谢这里的这个人 [link] (stackoverflow.com/questions/419184/…)
标签: android sms broadcastreceiver messaging