Können wir eine SMS in Android löschen, bevor sie den Posteingang erreicht?

100

Ich lösche eine SMS aus dem Posteingang, möchte aber wissen: Wie kann ich sie löschen, bevor sie den Posteingang erreicht?

umakant
quelle
2
Ist j2ee hier wirklich ein passender Tag?
Jitter
1
Warum sollte Java falsch sein, programmieren Sie nicht in Java auf Android?
Jitter
3
Das stinkt nach Bösem. Du solltest das nicht tun.
MattC
43
Es gibt legitime Verwendungen! Zum Beispiel, wenn Sie etwas (GPS-Standort senden, löschen oder etwas) auf Ihrem Telefon per SMS tun möchten, falls es gestohlen wird; Sie möchten nicht, dass jemand, der das Telefon gestohlen hat, diese SMS-Nachricht sieht.
Polyglot
21
Kommt schon Leute! Dies ist definitiv überhaupt nicht "böse". @ Polyglot ist richtig! Ich mache eine Anwendung, um die Nummer des Benutzers zu bestätigen (wie Viber) und ich brauche sie. Alles kann als "böse" verwendet werden. Installiere keine bösen Apps, nur das.
Felipe

Antworten:

187

Ja.

Trotz einiger negativer Reaktionen auf diese Frage gibt es legitime Verwendungsmöglichkeiten für das Abfangen von SMS. Zum Beispiel: Automatisierung der Überprüfung von Telefonnummern, Dienste, die per SMS bereitgestellt werden (obwohl dies im Allgemeinen mit Daten-SMS erfolgen sollte) oder für Anwendungen, die ansonsten die Benutzererfahrung verbessern, indem sie speziell formatierte Nachrichten verarbeiten, um sie in einem schönen Android anzuzeigen -spezifische Benutzeroberfläche.

Ab Android 1.6 werden eingehende SMS-Sendungen ( android.provider.Telephony.SMS_RECEIVED) als " bestellte Sendung " zugestellt. Dies bedeutet, dass Sie dem System mitteilen können, welche Komponenten die Sendung zuerst empfangen sollen.

Wenn Sie beim android:priorityAbhören von SMS ein Attribut definieren <intent-filter>, erhalten Sie die Benachrichtigung vor der nativen SMS-Anwendung.

Zu diesem Zeitpunkt können Sie die Übertragung abbrechen und verhindern, dass sie an andere Apps weitergegeben wird.


Update (Oktober 2013): Wenn Android 4.4 verfügbar ist, werden Änderungen an den SMS-APIs vorgenommen, die sich auf die Fähigkeit einer App auswirken können, die SMS-Zustellung zu beeinflussen.
Weitere Informationen finden Sie in diesem Blog-Beitrag für Android-Entwickler:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html

Christopher Orr
quelle
13
Heiliger Gott. Das ist wahr! Ich habe immer angenommen, dass es umgekehrt wäre! Zum Beweis schauen Sie hier . Beeindruckend. Ich wünschte, ich könnte dir mehr als eine Gegenstimme geben;)
Hamy
1
@kakopappa: Ja, wie in der Antwort erwähnt, funktioniert es ab Android 1.6+.
Christopher Orr
1
@herom Ich habe Apps, die Priorität verwenden 1000, also ist es möglich. In der Tat verwenden Handcent Priorität 2147483647.
Christopher Orr
2
Das hat bei mir funktioniert :) Meine App fängt zuerst die Nachricht ab und es gibt keine Benachrichtigung, aber dann gelangt die SMS nicht in den Posteingang der Nachrichten. Als ob es nie empfangen worden wäre, nur in meiner App. Gibt es eine Möglichkeit, die Abbruchübertragung zu verwenden, aber Nachrichten im Posteingang zu empfangen?
Pandabear
7
Es ist wichtig, die neue API-Stufe 19 zu berücksichtigen, wie @ChristopherOrr in seinem Update sagt. Dort steht es "Beginning with Android 4.4—any attempt by your app to abort the SMS_RECEIVED_ACTION broadcast will be ignored so all apps interested have the chance to receive it.".
GoRoS
11

Schritt 1: Erstellen Sie Ihren benutzerdefinierten Rundfunkempfänger, um SMS zu empfangen. Schreiben Sie die Logik, um den Broadst abzubrechen, damit die Nachricht nicht in Ihrem Posteingang verfügbar ist

public class SMSReceiver extends BroadcastReceiver
{
    public void onReceive(Context context, Intent intent)
    {
     if(conditionMatches){
     abortBroadcast();
     }
    }
}

Schritt-2 Registrieren Sie den Broadcast-Empfänger in AndoridManifest und setzen Sie Android: Prioritätswert eine große Zahl

<receiver android:name=".SMSReceiver" >
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

Das ist es

Wie funktioniert der obige Code?

Da es sich bei der SMS-Empfangsübertragung um eine geordnete Sendung handelt, empfängt der Empfänger mit hoher Priorität zuerst, sodass Ihre Anwendung zuerst empfängt und Sie nach dem Empfang die Sendung abbrechen. So kann keine andere Anwendung es erhalten. Daher ist die SMS im Posteingang nicht vorhanden

Sunil Kumar Sahoo
quelle
Können wir einen Rundfunkempfänger haben, wenn der Benutzer den Posteingang der Nachricht drückt, damit ich einen Sperrbildschirm entwickeln kann
?
9

Die folgende Lösung ("android: priority" und abortBroadcast ()) funktioniert so lange wie die Android Messaging-Anwendung als Standard (ich meinte die Standard-Android Messaging-Anwendung). Wenn der Benutzer "GoSMSPro" oder "HandcentSMS" installiert, werden in diesen Anwendungen weiterhin Nachrichten im Posteingang angezeigt. Ich glaube, dies liegt an "android: priority". Ich sehe keinen besseren Weg, um das oben genannte Problem zu beheben, wenn Messaging-Anwendungen von Drittanbietern auf dem Telefon installiert sind.

Subba
quelle
2
Guter Punkt. Dies sollte jedoch ein Kommentar sein, keine Antwort. Ist es möglich, es zu bewegen? --- und was ist, wenn Sie einen sehr hohen Wert legen? Als Android: Priorität = "9999"? beispielsweise? Hast du das versucht?
Felipe
4
@FelipeMicaroniLalli tatsächlich GO SMS PRO, etc ... verwenden Sie 2147483647 für ihre Priorität
RF43
1
@DDoSAttack 2147483647 ist das Maximum?
Felipe
3
Es ist die größte vorzeichenlose Ganzzahl ( en.wikipedia.org/wiki/Integer_(computer_science). Das
Maximum
2
@NomanHamid Das ist richtig. 999 ist die maximale Priorität. Sie können jede beliebige Nummer verwenden, Android garantiert jedoch nur bis zu 999. Alles, was größer ist, kann instabil sein oder auch nicht und unbeabsichtigte Folgen haben. Persönlich musste ich 2147483647 verwenden, um Apps wie GO SMS PRO zu überprüfen. Manchmal funktionierte es für Benutzer und manchmal nicht.
RF43
1
/**
 * Check priority
 * @param activity
 */
public static void receiverPriority(Activity activity){

    Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
    List<ResolveInfo> infos =  activity.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
    for (ResolveInfo info : infos) {
        System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
    }
}

Überprüfen Sie die Priorität und legen Sie eine höhere Priorität (in Ihrem Manifest) fest als bei anderen Empfängern.

Taran Mahal
quelle
0

Wenn Sie ein solches Szenario haben und die Nachricht zu dieser Kontaktnummer "+ 44xxxxx" usw. löschen oder ignorieren möchten, verwenden Sie diesen Code im SMS-Rundfunkempfänger

 if(sender.equalsIgnoreCase("+44xxxxxx")
   this.abortBroadCast();

Sie müssen auch die hohe Priorität festlegen.

Pir Fahim Shah
quelle