Tak, miałem grać, i to jest możliwe, aby usunąć odebrany SMS. Niestety nie wszystko jest proste :(
Mam odbiornik, który odbiera przychodzące wiadomości SMS. Sposób, w jaki działa routing przychodzący SMS na Androida polega na tym, że fragment kodu odpowiedzialny za dekodowanie wiadomości wysyła Broadcast (używa sendBroadcast()
metody - która niestety NIE jest wersją, która pozwala po prostu zadzwonić abortBroadcast()
) za każdym razem, gdy nadejdzie wiadomość.
Mój odbiorca może, ale nie musi, zostać wywołany przed systemowym odbiornikiem SMS, aw każdym przypadku odebrana transmisja nie ma właściwości, która mogłaby odzwierciedlać _id
kolumnę w tabeli SMS.
Jednak nie będąc osobą, której można tak łatwo zatrzymać, wysyłam sobie (za pośrednictwem Handlera) opóźnioną wiadomość z SmsMessage jako dołączonym obiektem. (Przypuszczam, że możesz też opublikować Runnable ...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
Opóźnienie ma na celu zapewnienie, że do czasu nadejścia wiadomości wszyscy odbiorcy rozgłoszeń zakończą pracę i wiadomość zostanie bezpiecznie umieszczona w tabeli SMS.
Kiedy otrzymam wiadomość (lub Runnable), oto co robię:
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())});
Używam adresu źródłowego i pola znacznika czasu, aby zapewnić bardzo wysokie prawdopodobieństwo usunięcia TYLKO interesującej mnie wiadomości. Gdybym chciał być jeszcze bardziej paranoikiem, mógłbym dołączyć msg.getMessageBody()
treść jako część zapytania.
Tak, wiadomość JEST usunięta (hura!). Niestety pasek powiadomień nie jest aktualizowany :(
Po otwarciu obszaru powiadomień zobaczysz wiadomość tam dla Ciebie ... ale kiedy ją dotkniesz, aby ją otworzyć - zniknęła!
Dla mnie to nie jest wystarczająco dobre - chcę, aby wszystkie ślady wiadomości zniknęły - nie chcę, aby użytkownik myślał, że istnieje TXT, gdy go nie ma (spowodowałoby to tylko raporty o błędach).
Wewnętrznie w systemie operacyjnym połączenia telefoniczne MessagingNotification.updateNewMessageIndicator(Context)
, ale ja ta klasa została ukryta przed API i nie chciałem replikować całego tego kodu tylko po to, aby wskaźnik był dokładny.