Entonces, tuve una jugada y es posible eliminar un SMS recibido. Desafortunadamente, no todo es sencillo :(
Tengo un receptor que recibe los mensajes SMS entrantes. Ahora, la forma en que funciona el enrutamiento entrante de SMS de Android es que el fragmento de código responsable de decodificar los mensajes envía una transmisión (utiliza el sendBroadcast()
método, que desafortunadamente NO es la versión que le permite simplemente llamar abortBroadcast()
) cada vez que llega un mensaje.
Mi receptor puede o no ser llamado antes que el receptor de SMS de Systems y, en cualquier caso, la transmisión recibida no tiene ninguna propiedad que pueda reflejar la _id
columna en la tabla de SMS.
Sin embargo, al no ser alguien que pueda ser detenido tan fácilmente, me publico (a través de un controlador) un mensaje retrasado con el SmsMessage como objeto adjunto. (Supongo que también podrías publicar un Runnable ...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
La demora está ahí para asegurar que para cuando llegue el mensaje, todos los receptores de transmisión habrán terminado sus cosas y el mensaje estará instalado de manera segura en la mesa de SMS.
Cuando se recibe el mensaje (o Runnable), esto es lo que hago:
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())});
Utilizo la dirección de origen y el campo de marca de tiempo para garantizar una probabilidad muy alta de eliminar SOLO el mensaje que me interesa. Si quisiera ser aún más paranoico, podría incluir el msg.getMessageBody()
contenido como parte de la consulta.
Sí, el mensaje ES eliminado (¡hurra!). Desafortunadamente, la barra de notificaciones no está actualizada :(
Cuando abras el área de notificación, verás el mensaje allí para ti ... pero cuando lo toques para abrirlo, ¡desaparecerá!
Para mí, esto no es lo suficientemente bueno; quiero que desaparezca todo rastro del mensaje; no quiero que el usuario piense que hay un TXT cuando no lo hay (eso solo causaría informes de errores).
Internamente, en el sistema operativo, el teléfono llama MessagingNotification.updateNewMessageIndicator(Context)
, pero esa clase se ha ocultado a la API, y no quería replicar todo ese código solo para que el indicador sea preciso.