Also hatte ich ein Spiel und es ist möglich, eine empfangene SMS zu löschen. Leider ist nicht alles einfach zu segeln :(
Ich habe einen Empfänger, der eingehende SMS-Nachrichten entgegennimmt. Das eingehende Routing für Android-SMS funktioniert nun so, dass der Code, der für die Dekodierung der Nachrichten verantwortlich ist, eine Sendung sendet (er verwendet die sendBroadcast()
Methode - die leider NICHT die Version ist, mit der Sie einfach anrufen könnenabortBroadcast()
jedem Eintreffen einer Nachricht ).
Mein Empfänger kann vor dem System-SMS-Empfänger angerufen werden oder nicht, und in jedem Fall hat die empfangene Sendung keine Eigenschaft, die die _id
Spalte in der SMS-Tabelle widerspiegeln könnte .
Da ich jedoch nicht so einfach gestoppt werden kann, poste ich mir (über einen Handler) eine verzögerte Nachricht mit der SmsMessage als angehängtem Objekt. (Ich nehme an, du könntest dir auch einen Runnable posten ...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
Die Verzögerung soll sicherstellen, dass bis zum Eintreffen der Nachricht alle Rundfunkempfänger ihre Arbeit beendet haben und die Nachricht sicher in der SMS-Tabelle gespeichert ist.
Wenn die Nachricht (oder Runnable) hier empfangen wird, mache ich Folgendes:
case MSG_DELETE_SMS:
Uri deleteUri = Uri.parse("content://sms");
SmsMessage msg = (SmsMessage)message.obj;
getContentResolver().delete(deleteUri, "address=? and date=?", new String[] {msg.getOriginatingAddress(), String.valueOf(msg.getTimestampMillis())});
Ich verwende das Feld für die ursprüngliche Adresse und den Zeitstempel, um eine sehr hohe Wahrscheinlichkeit zu gewährleisten, dass NUR die Nachricht gelöscht wird, an der ich interessiert bin. Wenn ich noch paranoider sein möchte, könnte ich die einschließen msg.getMessageBody()
Inhalt als Teil der Abfrage aufnehmen.
Ja, die Nachricht wird gelöscht (Hurra!). Leider wird die Benachrichtigungsleiste nicht aktualisiert :(
Wenn Sie den Benachrichtigungsbereich öffnen, wird die Nachricht dort für Sie angezeigt ... aber wenn Sie darauf tippen, um sie zu öffnen, ist sie weg!
Für mich ist dies nicht gut genug - ich möchte, dass alle Spuren der Nachricht verschwinden - ich möchte nicht, dass der Benutzer denkt, dass es eine TXT gibt, wenn dies nicht der Fall ist (dies würde nur Fehlerberichte verursachen).
Intern im Betriebssystem ruft das Telefon an MessagingNotification.updateNewMessageIndicator(Context)
, aber ich, diese Klasse, wurde vor der API ausgeblendet, und ich wollte nicht den gesamten Code replizieren, nur um den Indikator korrekt zu machen.