Quindi, ho giocato ed è possibile cancellare un SMS ricevuto. Purtroppo non è tutto normale :(
Ho un ricevitore che risponde ai messaggi SMS in arrivo. Ora il modo in cui funziona il routing in entrata degli SMS di Android è che il pezzo di codice responsabile della decodifica dei messaggi invia una trasmissione (utilizza il sendBroadcast()
metodo - che purtroppo NON è la versione che ti consente semplicemente di chiamare abortBroadcast()
) ogni volta che arriva un messaggio.
Il mio destinatario può o meno essere chiamato prima del ricevitore SMS di Sistema, e in ogni caso la trasmissione ricevuta non ha proprietà che potrebbero riflettere la _id
colonna nella tabella SMS.
Tuttavia, non essendo uno da fermare così facilmente, invio a me stesso (tramite un gestore) un messaggio ritardato con SmsMessage come oggetto allegato. (Suppongo che potresti pubblicare anche tu un Runnable ...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
Il ritardo è lì per garantire che, nel momento in cui arriva il messaggio, tutti i destinatari di Broadcast avranno finito il loro lavoro e il messaggio sarà inserito in modo sicuro nella tabella degli SMS.
Quando il messaggio (o Runnable) viene ricevuto ecco cosa faccio:
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())});
Uso l'indirizzo di origine e il campo timestamp per garantire un'elevata probabilità di eliminare SOLO il messaggio che mi interessa. Se volessi essere ancora più paranoico, potrei includere il msg.getMessageBody()
contenuto come parte della query.
Sì, il messaggio È cancellato (evviva!). Purtroppo la barra delle notifiche non viene aggiornata :(
Quando apri l'area di notifica vedrai il messaggio seduto lì per te ... ma quando lo tocchi per aprirlo, non c'è più!
Per me, questo non è abbastanza buono - voglio che tutte le tracce del messaggio scompaiano - non voglio che l'utente pensi che ci sia un TXT quando non c'è (ciò causerebbe solo segnalazioni di bug).
Internamente nel sistema operativo le telefonate MessagingNotification.updateNewMessageIndicator(Context)
, ma io quella classe è stata nascosta dall'API e non volevo replicare tutto quel codice solo per rendere l'indicatore accurato.