Usuwam wiadomość SMS ze skrzynki odbiorczej, ale chcę wiedzieć: jak mogę ją usunąć, zanim dotrze do skrzynki odbiorczej?
Usuwam wiadomość SMS ze skrzynki odbiorczej, ale chcę wiedzieć: jak mogę ją usunąć, zanim dotrze do skrzynki odbiorczej?
Odpowiedzi:
Tak.
Pomimo pewnych negatywnych reakcji na to pytanie, przechwytywanie wiadomości SMS ma uzasadnione zastosowania. Na przykład: automatyzacja weryfikacji numeru telefonu, usługi świadczone przez SMS (choć generalnie powinno się to robić za pomocą SMS-ów z danymi) lub dla aplikacji, które w inny sposób poprawiają wrażenia użytkownika, przetwarzając specjalnie sformatowane wiadomości w celu wyświetlenia ich w ładnym Androidzie -specyficzny interfejs użytkownika.
Począwszy od Androida 1.6, transmisje przychodzące wiadomości SMS ( android.provider.Telephony.SMS_RECEIVED
) są dostarczane jako „ rozsyłanie uporządkowane ” - co oznacza, że można powiedzieć systemowi, które komponenty powinny odebrać transmisję jako pierwsze.
Jeśli zdefiniujesz android:priority
atrybut nasłuchiwania SMS-ów <intent-filter>
, otrzymasz powiadomienie przed natywną aplikacją SMS.
W tym momencie możesz anulować transmisję, uniemożliwiając jej propagację do innych aplikacji.
Aktualizacja (październik 2013 r.): Kiedy pojawi się Android 4.4, wprowadzi zmiany w interfejsach API SMS, które mogą wpłynąć na możliwość wpływania przez aplikację na dostarczanie wiadomości SMS.
Więcej informacji znajdziesz w tym poście na blogu programistów Androida:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html
1000
, więc jest to możliwe. W rzeczywistości Handcent używa priorytetu 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."
.
Krok 1: Stwórz swój własny odbiornik do odbierania smsów. napisz logikę, aby przerwać najszerszą, aby wiadomość nie była dostępna w Twojej skrzynce odbiorczej
public class SMSReceiver extends BroadcastReceiver
{
public void onReceive(Context context, Intent intent)
{
if(conditionMatches){
abortBroadcast();
}
}
}
Step-2 Zarejestruj odbiornik transmisji w AndoridManifest i umieść android: wartość priorytetu dużą liczbę
<receiver android:name=".SMSReceiver" >
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Otóż to
Jak działa powyższy kod
Ponieważ odbieranie wiadomości SMS jest rozgłoszeniem uporządkowanym, odbiornik o wysokim priorytecie odbierze jako pierwszy, więc aplikacja odbierze jako pierwsza, a po odebraniu zostanie przerwana transmisja. Dlatego żadna inna aplikacja nie może go otrzymać. Dlatego sms nie będzie istniał w skrzynce odbiorczej
Poniższe rozwiązanie („android: priority” i abortBroadcast ()) działa tak długo, jak aplikacja Android Messaging jako domyślna (miałem na myśli standardową aplikację Android Messaging). Jeśli użytkownik zainstaluje „GoSMSPro” lub „HandcentSMS”, te aplikacje nadal wyświetlają wiadomości w skrzynce odbiorczej, wierzę, że to z powodu „android: priorytet”. Nie widzę lepszego sposobu rozwiązania powyższego problemu, jeśli w telefonie są zainstalowane aplikacje do przesyłania wiadomości innych firm.
/**
* 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);
}
}
Sprawdź priorytet i ustaw wyższy priorytet (w swoim manifeście) niż inni odbiorcy.
Jeśli masz taki scenariusz i chcesz usunąć lub zignorować wiadomość związaną z tym numerem kontaktowym „+ 44xxxxx” itp., Użyj tego kodu w odbiorniku wiadomości SMS
if(sender.equalsIgnoreCase("+44xxxxxx")
this.abortBroadCast();
Musisz także ustawić wysoki priorytet.