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?
risposta
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.
Risposta assolutamente brillante e spiegata molto bene, ha funzionato per me. Grazie. –
Questo non sembra funzionare con sistema operativo Android> = 4.3 –
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
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
Ho anche trovato che non funziona anche su 4.3. –
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.
- 1. Come salvare SMS in Posta in arrivo in Android?
- 2. Eliminare un sms dalla posta in arrivo
- 3. Come analizzare gli SMS in arrivo su Android?
- 4. Come eliminare tutti gli sms dalla posta in arrivo programmaticamente in Android?
- 5. Classe 0 SMS (flash SMS) su Android
- 6. PostgreSQL interrogazione posta in arrivo
- 7. Come aprire la posta in arrivo predefinita dal codice Android?
- 8. Blocca testi in arrivo (Android)
- 9. Come si ottiene un'icona in Posta in arrivo Google?
- 10. Android: ricevi tutti gli sms inviati? (posta in uscita)
- 11. Creazione di un'applicazione SMS in Android?
- 12. Individuazione della Posta in arrivo Bluetooth
- 13. API per Posta in arrivo di Gmail
- 14. Blocca SMS in arrivo su Android 4.4 con radice o superiore?
- 15. Come accedere all'archivio SMS su Android?
- 16. Impossibile inviare SMS tramite SMSManager in Android
- 17. SMS URL su Android
- 18. Come leggo la posta in arrivo usando C#
- 19. Android 1.5: lettura dei messaggi SMS
- 20. Google Posta in arrivo come RecyclerVisualizza animazione aperta
- 21. Android: come ottenere il numero di telefono da un SMS in arrivo?
- 22. schermata chiamata in arrivo Android
- 23. Come assicurarsi che gli SMS vengano inviati in Android
- 24. Nessuna posta ricevuta nella posta in arrivo con XAMPP 1.8.0, MercuryMail e posta()
- 25. Come impedire che il mouse entri/vada a ripetersi troppe volte
- 26. Come acquisire l'evento Ajax che aggiorna periodicamente la posta in arrivo di Gmail
- 27. SMS raw pdu in Android
- 28. API SMS Android
- 29. Rifiuta chiamata in arrivo in Android
- 30. Rispondi alla chiamata in arrivo su Android 6.0
http://stackoverflow.com/questions/9123125/class-0-sms-flash-sms-on-android/9123172#9123172 – xDragonZ
@Tom Medely. Grazie. – nsm
Possibile [duplicato] (http://stackoverflow.com/q/1741628/1050058) –