Donc, j'ai fait une pièce, et c'est est Il est possible de supprimer un SMS reçu. Malheureusement, tout n'est pas rose :(
J'ai un récepteur qui capte les messages SMS entrants. La façon dont le routage des SMS entrants d'Android fonctionne est que le morceau de code responsable du décodage des messages envoie une diffusion (il utilise la balise sendBroadcast()
qui, malheureusement, n'est PAS la version qui vous permet d'appeler simplement la méthode abortBroadcast()
) dès qu'un message arrive.
Mon récepteur peut ou non être appelé avant le récepteur SMS de Systems, et dans tous les cas, la diffusion reçue n'a aucune propriété qui pourrait refléter la _id
dans le tableau SMS.
Cependant, comme je ne suis pas du genre à me laisser arrêter aussi facilement, je poste moi-même (via un Handler) un message différé avec le SmsMessage comme objet attaché. (Je suppose que vous pourriez aussi vous poster un Runnable...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
Ce délai permet de s'assurer qu'au moment où le message arrive, tous les récepteurs de diffusion auront terminé leur travail et que le message sera bien rangé dans la table SMS.
Lorsque le message (ou Runnable) est reçu, voici ce que je fais :
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())});
J'utilise l'adresse d'origine et le champ d'horodatage pour garantir une probabilité très élevée de supprimer UNIQUEMENT le message qui m'intéresse. Si je voulais être encore plus paranoïaque, je pourrais inclure le champ msg.getMessageBody()
dans le cadre de la requête.
Oui, le message est supprimé (hourra !). Malheureusement, la barre de notification n'est pas mise à jour :(
Lorsque vous ouvrez la zone de notification, vous voyez le message qui s'y trouve... mais lorsque vous tapez dessus pour l'ouvrir, il a disparu !
Je ne veux pas que l'utilisateur pense qu'il y a un TXT alors qu'il n'y en a pas (cela ne ferait que provoquer des rapports de bogue).
En interne, dans l'OS, le téléphone appelle MessagingNotification.updateNewMessageIndicator(Context)
Mais cette classe a été cachée de l'API, et je ne voulais pas reproduire tout ce code juste pour rendre l'indicateur précis.
4 votes
J'ai trouvé que faire quoi que ce soit d'utile avec les capacités téléphoniques d'Android était une expérience très désagréable.
1 votes
Bonne question mon pote. Je cherchais quelque chose de similaire :D cheers
3 votes
Le mieux serait d'empêcher le SMS d'atteindre la boîte de réception : stackoverflow.com/questions/1741628/