2012-06-29 12 views
5

Ich arbeite an einer SMS-Blocker-Anwendung, in der ich Broadcast-Empfänger und abortBroadcast() -Methode verwende - wie viele PPL hier vorgeschlagen haben - um zu verhindern, dass Nachrichten den Posteingang erreichen und den Benutzer alarmieren. Aber in meinem Fall, wenn ich eine SMS mit dem Emulator senden, wird die SMS-Nachricht nicht blockiert werden, und erreicht den Posteingang, auch bekomme ich einen Fehler:SMS kann nicht mit abortBroadcast() verhindert werden?

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

, die nicht beendet die App in der Emulator, aber die Anwendung wird beendet, wenn ich es auf meinem Handy teste.

Und ja, ich habe den Empfänger Priorität auf eine hohe Zahl festgelegt und für die Berechtigungen gefragt, wie Sie hier sehen:

<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"/> 

Schließlich ist hier mein Code:

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(); 
       } 
      } 
     } 
    } 
} 

Irgend jemand vorgeschlagen here, dass die SMS-Übertragungen nicht abgebrochen werden können, da Android dies nicht zulässt. Aber ich habe viele Leute gesehen, die hier vorgeschlagen haben, abortBroadcast() zu benutzen, um eine SMS zu blockieren, und ich kenne auch einige SMS-Blocker-Apps auf dem Markt, die eigentlich SMS blockieren können. Ich weiß nicht, ob sie abortbroadcast verwenden oder nicht.

Irgendwelche Ideen?

+0

Bitte zu ändern, wenn Sie Ihre Lösung bekommen haben :) –

+0

Ich glaube, ich bekam die Antwort, „Ab Android 1.6, eingehende SMS-Nachrichtensendungen (android.provider.Telephony.SMS_RECEIVED) werden als "geordnete Rundsendung" zugestellt. Dies bedeutet, dass Sie dem System mitteilen können, welche Komponenten zuerst die Sendung erhalten sollen. " und ich benutze Android 1.5 Und die Sendung ist nicht bestellt! Danke an diesen Typen hier [link] (http://stackoverflow.com/questions/419184/how-to-delete-an-sms-from-the-inbox-in-android-programmatisch) – Wise

Antwort

1

"Ab Android 1.6 werden eingehende SMS-Broadcasts (android.provider.Telephony.SMS_RECEIVED) als" ordered broadcast "gesendet. Dies bedeutet, dass Sie dem System mitteilen können, welche Komponenten zuerst die Übertragung erhalten sollen." und ich benutze Android 1.5 Und die Sendung ist nicht bestellt!

Dank diesen Kerl hier link

2

Definitiv Sie dies tun können, Code, den Sie geschrieben haben, ist völlig in Ordnung,

changin Priorität Versuchen <intent-filter android:priority="9999999">-<intent-filter android:priority="99999999">, grundsätzlich höhere Priorität dann, was Sie gegeben haben, dann versuchen zu überprüfen.

+0

Danke für die Antwort, aber das scheint nicht zu helfen. Und ich denke, wenn meine Anwendung die Übertragung verpasst hat, wäre kein Fehler da, nur die Benachrichtigung. Ich denke, es gibt ein Problem mit geordneten oder nicht geordneten Sendungen. – Wise

+0

'Thread.currentThread(). SetPriority (Thread.MAX_PRIORITY);' –

1

Ist es den Toast von Empfänger zeigt? Wahrscheinlich ist Ihr Empfänger nicht korrekt in Manifest registriert. Annehmen/upvote die Antwort

versuchen,

<receiver android:name="SMSMonitor"> 

zu

<receiver android:name=".SMSMonitor">