2012-02-07 15 views
15

Sto sviluppando un'applicazione aziendale per gli SMS. In questa app, se un messaggio in entrata proviene da un determinato numero, ad esempio 999999999, dovrebbe andare nella posta in arrivo dell'applicazione e non nella casella di posta nativa predefinita. Tutti gli altri messaggi dovrebbero andare nella casella di posta nativa del telefono. Come faccio a fare questo?Come impedire che SMS entri in Posta in arrivo su Android?

+0

http://stackoverflow.com/questions/9123125/class-0-sms-flash-sms-on-android/9123172#9123172 – xDragonZ

+0

@Tom Medely. Grazie. – nsm

+0

Possibile [duplicato] (http://stackoverflow.com/q/1741628/1050058) –

risposta

1

Sei tu quello che invia i messaggi? In tal caso, considera invece l'utilizzo di datasms poiché non verranno visualizzati nella Posta in arrivo.

Controllare this domanda per ulteriori informazioni su come usarlo

+0

Grazie. Mi ha aiutato molto. – nsm

30

Quando SMS viene ricevuto dal sistema Android, trasmette un ordered broadcastIntent con l'azione "android.provider.Telephony.SMS_RECEIVED". Tutti i ricevitori registrati, inclusa l'applicazione SMS predefinita di sistema, ricevono questo Intent nell'ordine priority impostato nel loro intent-filter. L'ordine per i ricevitori broadcast con la stessa priorità non è specificato. Qualsiasi BroadcastReceiver potrebbe impedire a qualsiasi altro ricevitore di trasmissione registrato di ricevere la trasmissione utilizzando abortBroadcast(). Ricevitore

Quindi, tutto ciò che serve è trasmesso in questo modo:

public class SmsFilter extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 
      Bundle extras = intent.getExtras(); 
      if (extras != null) { 
       Object[] pdus = (Object[])extras.get("pdus"); 

       if (pdus.length < 1) return; // Invalid SMS. Not sure that it's possible. 

       StringBuilder sb = new StringBuilder(); 
       String sender = null; 
       for (int i = 0; i < pdus.length; i++) { 
        SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]); 
        if (sender == null) sender = message.getOriginatingAddress(); 
        String text = message.getMessageBody(); 
        if (text != null) sb.append(text); 
       } 
       if (sender != null && sender.equals("999999999")) { 
        // Process our sms... 
        abortBroadcast(); 
       } 
       return; 
      } 
     } 

     // ... 
    } 
} 

Sembra che l'applicazione di elaborazione SMS di default del sistema utilizza la priorità di 0, così si potrebbe provare 1 per la vostra applicazione per essere prima di esso. Aggiungere queste righe al AndroidManifest.xml:

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

Non dimenticare autorizzazioni necessarie:

<uses-permission android:name="android.permission.RECEIVE_SMS"/> 

Tra l'altro, è possibile trovare tutti i ricevitori registrati e le loro priorità utilizzando questo codice:

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

Aggiornamento: Come FantasticJamieBurn said below, a partire da Android 4.4 l'unica applicazione in grado di intercettare L'SMS (e il blocco se lo desidera) è l'app SMS predefinita (selezionata dall'utente). Tutte le altre app possono solo ascoltare gli SMS in arrivo se l'app SMS predefinita non la blocca.

Vedere anche SMS Provider nelle API di Android 4.4.

+1

Risposta assolutamente brillante e spiegata molto bene, ha funzionato per me. Grazie. –

+4

Questo non sembra funzionare con sistema operativo Android> = 4.3 –

2

Si può essere fatto

public void onReceive(Context context, Intent intent) 
{ 
    Bundle bundle=intent.getExtras(); 
    Object[] messages=(Object[])bundle.get("pdus"); 
    SmsMessage[] sms=new SmsMessage[messages.length]; 

    Toast.makeText(context, "Hello", 1).show(); 

    for(int n=0;n<messages.length;n++){ 
     sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]); 
    } 

    for(SmsMessage msg:sms){ 
     if(msg.getOriginatingAddress().endsWith(number)) 
     { 
     SMS.updateMessageBox("\nFrom: "+msg.getOriginatingAddress()+"\n"+ 
       "Message: "+msg.getMessageBody()+"\n"); 
      /*((SMS) context).delete();*/ 
     abortBroadcast(); 
     } 
    } 
} 

basta usare abortbroadcast() dopo aver ricevuto in applicazione

12

Con il rilascio di Android 4.4 KitKat (livello di API 19), la possibilità di bloccare uno SMS messaggio e impedire che venga consegnato all'app SMS predefinita è stato rimosso. Le app di SMS non predefinite possono osservare i messaggi SMS man mano che vengono ricevuti, ma qualsiasi tentativo di interrompere la trasmissione verrà ignorato da Android 4.4+.

Se si dispone di un'app esistente che si basa su interruzioni di messaggi SMS interrotti, è possibile prendere in considerazione l'impatto che questo cambiamento di comportamento avrà quando gli utenti eseguiranno l'aggiornamento ad Android 4.4+.

http://android-developers.blogspot.co.uk/2013/10/getting-your-sms-apps-ready-for-kitkat.html

+0

Ho anche trovato che non funziona anche su 4.3. –

1

Controllare il numero del mittente è uguale al numero di cellulare del vostro sms invio di telefono.

sostituire la seguente riga di codice del sig "droide pretoriana"

if (sender != null && sender.equals("999999999")) { 

a

if (sender != null && sender.equals("YOUR SMS SENDING MOBILE NUMBER HERE")) { 

ulteriormente più si può dare un impostazione per all'utente di aggiungere manualmente l'invio di SMS numero se si vuole cambiare esso.

Problemi correlati