私はブロードキャストレシーバーとabortBroadcast()メソッドを使用しているSMSブロッカーアプリケーションに取り組んでいます. しかし、私の場合、エミュレーターを使用して SMS を送信すると、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();
}
}
}
}
}
ここで、Android が許可しないため、SMS ブロードキャストを中止できないと提案した人もいます。しかし、ここで多くの人がabortBroadcast()を使用してSMSをブロックすることを提案しているのを見てきました。また、実際にSMSをブロックできる市場のSMSブロッカーアプリをいくつか知っています. 彼らがabortbroadcastを使用しているかどうかはわかりません。
何か案は?