Pouvons-nous supprimer un SMS dans Android avant qu'il n'atteigne la boîte de réception?


100

Je supprime un SMS de la boîte de réception mais je veux savoir: comment puis-je le supprimer avant qu'il n'atteigne la boîte de réception?


2
Est-ce que j2ee est vraiment une balise correspondante ici?
gigue

1
Pourquoi java serait-il incorrect si vous ne programmez pas en java sur Android?
gigue

3
Cela sent le mal. Vous ne devriez pas faire ça.
MattC

43
Il y a des utilisations légitimes! Par exemple, si vous voulez faire quelque chose (envoyer une position GPS, effacer ou quelque chose) sur votre téléphone via SMS en cas de vol; vous ne voulez pas que celui qui a volé le téléphone voie ce SMS.
polyglotte

21
Allez! Ce n'est certainement PAS "mal" du tout. @polyglot a raison! Je fais une application pour confirmer le numéro de l'utilisateur (comme le fait Viber) et j'en ai besoin. Tout peut être utilisé comme "mal". N'installez pas de mauvaises applications, juste ça.
Felipe

Réponses:


187

Oui.

Malgré quelques réactions négatives à cette question, il existe des utilisations légitimes de l'interception SMS. Par exemple: automatiser la vérification du numéro de téléphone, les services qui sont fournis par SMS (bien que généralement cela devrait être fait avec des SMS de données), ou pour les applications qui améliorent autrement l'expérience utilisateur en traitant des messages spécialement formatés afin de les afficher dans un bel Android -UI spécifique.

À partir d'Android 1.6, les diffusions de messages SMS entrants ( android.provider.Telephony.SMS_RECEIVED) sont livrées sous la forme d'une « diffusion ordonnée », ce qui signifie que vous pouvez indiquer au système quels composants doivent recevoir la diffusion en premier.

Si vous définissez un android:priorityattribut sur votre écoute SMS <intent-filter>, vous recevrez alors la notification avant l'application SMS native.

À ce stade, vous pouvez annuler la diffusion, l'empêchant de se propager à d'autres applications.


Mise à jour (octobre 2013): à l' arrivée d'Android 4.4, il apportera des modifications aux API SMS, ce qui peut affecter la capacité d'une application à influencer la livraison de SMS.
Consultez cet article de blog des développeurs Android pour plus d'informations:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html


13
Mon Dieu. C'est vrai! J'ai toujours pensé que ce serait l'inverse! Pour preuve, regardez ici . Sensationnel. J'aimerais pouvoir vous donner plus d'un vote favorable;)
Hamy

1
@kakopappa: Oui, comme mentionné dans la réponse, cela fonctionne à partir d'Android 1.6+.
Christopher Orr

1
@herom J'ai des applications qui utilisent la priorité 1000, c'est donc possible. En fait, Handcent utilise la priorité 2147483647.
Christopher Orr

2
Cela a fonctionné pour moi :) Mon application attrape d'abord le message et il n'y a pas de notification, mais les sms ne parviennent pas à la boîte de réception Messages. Comme s'il n'avait jamais été reçu, uniquement dans mon application. Existe-t-il un moyen d'utiliser la diffusion d'abandon mais de recevoir des messages dans la boîte de réception?
pandabear du

7
Il est important de garder à l'esprit le nouveau niveau d'API 19 comme le dit @ChristopherOrr dans sa mise à jour. Là, il dit "Beginning with Android 4.4—any attempt by your app to abort the SMS_RECEIVED_ACTION broadcast will be ignored so all apps interested have the chance to receive it.".
GoRoS

11

Étape 1: Créez votre récepteur de diffusion personnalisé pour recevoir des sms. écrivez la logique pour abandonner la diffusion afin que le message ne soit pas disponible dans votre boîte de réception

public class SMSReceiver extends BroadcastReceiver
{
    public void onReceive(Context context, Intent intent)
    {
     if(conditionMatches){
     abortBroadcast();
     }
    }
}

Étape 2 Enregistrez le récepteur de diffusion dans AndoridManifest et mettez Android: valeur de priorité un grand nombre

<receiver android:name=".SMSReceiver" >
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

C'est tout

Comment fonctionne le code ci-dessus

Comme la réception de SMS est une diffusion ordonnée, le récepteur avec une priorité élevée recevra en premier afin que votre application reçoive en premier et après réception, vous interrompez la diffusion. Aucune autre application ne peut donc la recevoir. Par conséquent, le sms n'existera pas dans la boîte de réception


pouvons-nous avoir un récepteur de diffusion, lorsque l'utilisateur appuie sur la boîte de réception des messages, afin que je puisse développer un écran de verrouillage ..
Vamsi Pavan Mahesh

9

La solution ci-dessous ("android: priority" et abortBroadcast ()) fonctionne aussi longtemps que l'application de messagerie Android par défaut (je voulais dire l'application de messagerie Android d'origine). Si l'utilisateur installe "GoSMSPro" ou "HandcentSMS", ces applications affichent toujours des messages dans la boîte de réception, je crois que cela est dû à "android: priorité". Je ne vois pas de meilleur moyen de résoudre le problème ci-dessus, si des applications de messagerie tierces sont installées sur le téléphone.


2
Bon point. Mais cela devrait être un commentaire, pas une réponse. Est-il possible de le déplacer? --- et si vous accordez une valeur très élevée? Comme Android: priority = "9999"? par exemple? Avez-vous essayé cela?
Felipe

4
@FelipeMicaroniLalli en fait GO SMS PRO, etc ... utiliser 2147483647 pour leur priorité
rf43

1
@DDoSAttack 2147483647 est le maximum?
Felipe

3
C'est le plus grand entier non signé en.wikipedia.org/wiki/Integer_(computer_science) le maximum pris en charge par Android est de 999. developer.android.com/reference/android/content
...

2
@NomanHamid C'est correct. 999 est la priorité maximale. Vous pouvez utiliser le numéro de votre choix, mais Android ne garantira que 999. Tout ce qui est plus grand que cela et cela peut ou non être instable et avoir des conséquences inattendues. Personnellement, j'ai dû utiliser 2147483647 pour essayer de parcourir des applications comme GO SMS PRO. Parfois, cela fonctionnait pour les utilisateurs et parfois non.
rf43

1
/**
 * Check priority
 * @param activity
 */
public static void receiverPriority(Activity activity){

    Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
    List<ResolveInfo> infos =  activity.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
    for (ResolveInfo info : infos) {
        System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
    }
}

Vérifiez la priorité et définissez une priorité plus élevée (dans votre manifeste) que les autres destinataires.


0

Si vous avez un scénario comme celui-ci et que vous souhaitez supprimer ou ignorer le message lié à ce numéro de contact "+ 44xxxxx", etc., utilisez ce code dans SMS Broadcast receiver

 if(sender.equalsIgnoreCase("+44xxxxxx")
   this.abortBroadCast();

Vous devez également lui attribuer la haute priorité.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.