Sto cancellando un SMS dalla posta in arrivo ma desidero sapere: come posso cancellarlo prima che raggiunga la posta in arrivo?
Sto cancellando un SMS dalla posta in arrivo ma desidero sapere: come posso cancellarlo prima che raggiunga la posta in arrivo?
Risposte:
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:priority
attributo 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
1000
, quindi è possibile. In effetti, Handcent sta usando la priorità 2147483647
.
"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."
.
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
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.
/**
* 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.
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.