Então, eu joguei e é possível deletar um SMS recebido. Infelizmente, nem tudo é fácil :(
Tenho um receptor que capta as mensagens SMS recebidas. Agora a forma como funciona o roteamento de entrada de SMS do Android é que o pedaço de código responsável por decodificar as mensagens envia um Broadcast (ele usa o sendBroadcast()
método - que infelizmente NÃO é a versão que permite simplesmente ligar abortBroadcast()
) sempre que uma mensagem chega.
Meu receptor pode ou não ser chamado antes do receptor SMS de Sistemas e, em qualquer caso, a transmissão recebida não tem nenhuma propriedade que possa refletir a _id
coluna na tabela SMS.
No entanto, não sendo alguém que pode ser interrompido tão facilmente, eu mesmo postarei (através de um Handler) uma mensagem atrasada com o SmsMessage como o objeto anexado. (Suponho que você também poderia postar um Runnable ...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
O atraso existe para garantir que, no momento em que a mensagem chegar, todos os receptores de Broadcast terão terminado suas tarefas e a mensagem estará armazenada com segurança na tabela de SMS.
Quando a mensagem (ou Runnable) é recebida, aqui está o que eu faço:
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())});
Eu uso o endereço de origem e o campo de carimbo de data / hora para garantir uma probabilidade muito alta de excluir SOMENTE a mensagem na qual estou interessado. Se eu quisesse ser ainda mais paranóico, poderia incluir o msg.getMessageBody()
conteúdo como parte da consulta.
Sim, a mensagem foi excluída (hooray!). Infelizmente, a barra de notificação não é atualizada :(
Quando você abre a área de notificação, você verá a mensagem lá para você ... mas quando você toca nela para abri-la - ela se foi!
Para mim, isso não é bom o suficiente - quero que todos os rastros da mensagem desapareçam - não quero que o usuário pense que há um TXT quando não há (isso só causaria relatórios de bug).
Internamente no sistema operacional, os telefonemas chamam MessagingNotification.updateNewMessageIndicator(Context)
, mas essa classe foi ocultada da API e não queria replicar todo aquele código apenas para tornar o indicador preciso.