web-dev-qa-db-fra.com

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

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?

100
umakant

Oui.

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

À partir de Android 1.6, SMS diffusions de messages entrants (Android.provider.Telephony.SMS_RECEIVED) sont livrés sous la forme " 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:priority attribut sur votre écoute SMS <intent-filter>, vous recevrez alors la notification avant l'application native SMS.

À ce stade, vous pouvez annuler la diffusion, l'empêchant d'être propagée à d'autres applications.


Mise à jour (octobre 2013): Lorsque Android 4.4 arrive, il apportera des modifications au SMS API qui peuvent affecter la capacité d'une application à influencer SMS delivery.
Consultez cet article Android Blog des développeurs pour plus d'informations:
http://Android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-KitKat.html

186
Christopher Orr

Étape 1: Créez votre récepteur de diffusion personnalisé pour recevoir des sms. écrire 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 Enregistrer le récepteur de diffusion dans AndoridManifest et mettre Android: valeur prioritaire 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 SMS la réception d'une diffusion large est une diffusion ordonnée, le récepteur avec une priorité élevée recevra en premier afin que votre application reçoive d'abord et après la réception, vous abandonnez la diffusion. Donc, aucune autre application ne peut la recevoir. D'où le sms n'existera pas dans la boîte de réception

11
Sunil Kumar Sahoo

La solution ci-dessous ("Android: priorité" et abortBroadcast ()) fonctionne tant que Android Application de messagerie par défaut (je voulais dire stock Android Application de messagerie). Si l'utilisateur installe "GoSMSPro" ou "HandcentSMS", ces applications affichent toujours des messages dans la boîte de réception, je le pense en raison de "Android: priorité". Je ne vois pas de meilleure façon de résoudre le problème ci-dessus, si des applications de messagerie tierces sont installées au téléphone.

9
Subba
/**
 * 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 récepteurs.

1
taran mahal

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 priorité élevée.

0
Pir Fahim Shah