Donc, j'ai eu un jeu, et il est possible de supprimer un SMS reçu. Malheureusement, tout n'est pas simple :(
J'ai un récepteur qui détecte les SMS entrants. Maintenant, la façon dont fonctionne le routage entrant SMS Android est que le morceau de code responsable du décodage des messages envoie une diffusion (il utilise la sendBroadcast()
méthode - qui n'est malheureusement PAS la version qui vous permet simplement d'appeler abortBroadcast()
) chaque fois qu'un message arrive.
Mon récepteur peut ou non être appelé avant le récepteur SMS de Systems, et dans tous les cas l'émission reçue n'a aucune propriété qui pourrait refléter la _id
colonne dans la table SMS.
Cependant, n'étant pas du genre à être arrêté aussi facilement, je poste moi-même (via un gestionnaire) un message retardé 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);
Le délai est là pour s'assurer qu'au moment où le message arrive, tous les récepteurs de diffusion auront terminé leur travail et le message sera en toute sécurité installé 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 assurer une très forte probabilité de supprimer UNIQUEMENT le message qui m'intéresse. Si je voulais être encore plus paranoïaque, je pourrais inclure le msg.getMessageBody()
contenu 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 verrez le message assis là pour vous ... mais lorsque vous appuyez dessus pour l'ouvrir - il est parti!
Pour moi, ce n'est pas assez bien - je veux que toute trace du message disparaisse - 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 le système d'exploitation, les appels téléphoniques MessagingNotification.updateNewMessageIndicator(Context)
, mais je cette classe a été cachée de l'API, et je ne voulais pas répliquer tout ce code juste pour rendre l'indicateur précis.