Possiamo eliminare un SMS in Android prima che raggiunga la posta in arrivo?


100

Sto cancellando un SMS dalla posta in arrivo ma desidero sapere: come posso cancellarlo prima che raggiunga la posta in arrivo?


2
J2ee è davvero un tag corrispondente qui?
jitter

1
Perché Java non è corretto se non programmi in Java su Android?
jitter

3
Questo puzza di male. Non dovresti farlo.
MattC

43
Ci sono usi legittimi! Ad esempio se vuoi fare qualcosa (inviare posizione GPS, cancellare o qualcosa del genere) sul tuo telefono tramite SMS nel caso in cui venga rubato; non vuoi che chi ha rubato il telefono veda quel messaggio SMS.
poliglotta

21
Andiamo gente! Questo NON è assolutamente "malvagio". @polyglot ha ragione! Sto facendo un'applicazione per confermare il numero dell'utente (come fa Viber) e ne ho bisogno. Tutto può essere usato come "male". Non installare app malvagie, solo quello.
Felipe

Risposte:


187

Sì.

Nonostante alcune reazioni negative a questa domanda, ci sono usi legittimi per l'intercettazione di SMS. Ad esempio: automatizzazione della verifica del numero di telefono, servizi forniti tramite SMS (anche se generalmente questo dovrebbe essere fatto con SMS di dati), o per applicazioni che altrimenti migliorano l'esperienza dell'utente elaborando messaggi appositamente formattati per mostrarli in un bel Android -specifica UI.

A partire da Android 1.6, le trasmissioni di messaggi SMS in arrivo ( android.provider.Telephony.SMS_RECEIVED) vengono consegnate come una " trasmissione ordinata ", il che significa che puoi dire al sistema quali componenti dovrebbero ricevere la trasmissione per primi.

Se definisci un android:priorityattributo sul tuo ascolto SMS <intent-filter>, riceverai la notifica prima dell'applicazione SMS nativa.

A questo punto, puoi annullare la trasmissione, impedendo che venga propagata ad altre app.


Aggiornamento (ottobre 2013): all'arrivo di Android 4.4, verranno apportate modifiche alle API SMS che potrebbero influire sulla capacità di un'app di influenzare la consegna degli SMS.
Dai un'occhiata a questo post del blog degli sviluppatori Android per ulteriori informazioni:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html


13
Santo Dio. Questo è vero! Ho sempre pensato che sarebbe stato il contrario! Per la prova, guarda qui . Wow. Vorrei poterti dare più di un voto positivo;)
Hamy

1
@kakopappa: Sì, come menzionato nella risposta funziona da Android 1.6+.
Christopher Orr

1
@herom Ho app che usano la priorità 1000, quindi è possibile. In effetti, Handcent sta usando la priorità 2147483647.
Christopher Orr

2
Questo ha funzionato per me :) La mia app cattura prima il messaggio e non ci sono notifiche, ma poi gli sms non arrivano alla posta in arrivo dei messaggi. Come se non fosse mai stato ricevuto, solo nella mia app. C'è un modo per utilizzare l'interruzione della trasmissione ma per ricevere i messaggi nella posta in arrivo?
pandabear

7
È importante tenere a mente il nuovo livello API 19 come dice @ChristopherOrr nel suo aggiornamento. Là dice "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

Passaggio 1: crea il tuo ricevitore di trasmissione personalizzato per ricevere sms. scrivi la logica per interrompere l'ampliamento in modo che il messaggio non sia disponibile nella tua casella di posta

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

Step-2 Registra il ricevitore di trasmissione in AndoridManifest e metti android: valore di priorità un numero elevato

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

Questo è tutto

Come funziona il codice sopra

Poiché la ricezione di SMS broadcast è una trasmissione ordinata, il destinatario con priorità alta riceverà per primo, quindi la tua applicazione riceverà per prima e dopo aver ricevuto la trasmissione verrà interrotta. Quindi nessun'altra applicazione può riceverlo. Quindi l'SMS non esisterà nella posta in arrivo


possiamo avere un ricevitore di trasmissione, quando l'utente preme la posta in arrivo del messaggio, in modo che io possa sviluppare una schermata di blocco ..
Vamsi Pavan Mahesh

9

La soluzione seguente ("android: priority" e abortBroadcast ()) funziona fintanto che l'applicazione di messaggistica Android è predefinita (intendevo l'applicazione di messaggistica Android di serie). Se l'utente installa "GoSMSPro" o "HandcentSMS", queste applicazioni continuano a mostrare messaggi nella posta in arrivo, credo che ciò sia dovuto a "android: priority". Non vedo un modo migliore per risolvere il problema di cui sopra, se sul telefono sono installate applicazioni di messaggistica di terze parti.


2
Buon punto. Ma questo dovrebbe essere un commento, non una risposta. È possibile spostarlo? --- e se mettessi un valore molto alto? Come Android: priorità = "9999"? per esempio? L'hai provato?
Felipe

4
@FelipeMicaroniLalli in realtà GO SMS PRO, ecc ... usa 2147483647 per la loro priorità
rf43

1
@DDoSAttack 2147483647 è il massimo?
Felipe

3
È il più grande numero intero senza segno en.wikipedia.org/wiki/Integer_(computer_science) il massimo supportato da Android è 999. developer.android.com/reference/android/content/…
rf43

2
@NomanHamid È corretto. 999 è la priorità massima. Puoi utilizzare qualsiasi numero tu scelga, Android garantirà solo fino a 999. Qualunque cosa più grande di quella e può o non può essere instabile e avere conseguenze indesiderate. Personalmente, ho dovuto usare 2147483647 per provare a superare app come GO SMS PRO. A volte ha funzionato per gli utenti ea volte no.
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);
    }
}

Controlla la priorità e imposta una priorità più alta (nel tuo manifest) rispetto ad altri ricevitori.


0

Se hai uno scenario come questo e desideri eliminare o ignorare il messaggio relativo a questo numero di contatto "+ 44xxxxx" ecc., Utilizza questo codice nel ricevitore di trasmissione SMS

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

Devi anche impostare la priorità alta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.