Czy możemy usunąć SMS-a w systemie Android, zanim dotrze do skrzynki odbiorczej?


100

Usuwam wiadomość SMS ze skrzynki odbiorczej, ale chcę wiedzieć: jak mogę ją usunąć, zanim dotrze do skrzynki odbiorczej?


2
Czy j2ee naprawdę jest tutaj pasującym tagiem?
— jitter

1
Dlaczego Java miałby być niepoprawna, nie programujesz w Javie na Androida?
— jitter

3
To cuchnie złem. Nie powinieneś tego robić.
— MattC

43
Istnieją legalne zastosowania! Na przykład, jeśli chcesz coś zrobić (wysłać lokalizację GPS, wyczyścić lub coś) na swoim telefonie za pomocą wiadomości SMS na wypadek kradzieży; nie chcesz, aby ktokolwiek ukradł telefon, zobaczył tę wiadomość SMS.
— polyglot

21
Dajcie spokój ludzie! To zdecydowanie NIE jest „zło”. @polyglot ma rację! Robię aplikację, aby potwierdzić numer użytkownika (tak jak robi to Viber) i potrzebuję tego. Wszystko może być użyte jako „zło”. Nie instaluj złych aplikacji, tylko to.
— Felipe

Odpowiedzi:


187

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:priorityatrybut 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


13
Święty Boże. To prawda! Zawsze zakładałem, że będzie odwrotnie! Aby uzyskać dowód, spójrz tutaj . Łał. Żałuję, że nie mogę dać Ci więcej niż jednego głosu za;)
— Hamy

1
@kakopappa: Tak, jak wspomniano w odpowiedzi, działa na Androidzie 1.6+.
— Christopher Orr,

1
@herom Mam aplikacje, które używają priorytetu 1000, więc jest to możliwe. W rzeczywistości Handcent używa priorytetu 2147483647.
— Christopher Orr

2
U mnie to zadziałało :) Najpierw moja aplikacja przechwytuje wiadomość i nie ma powiadomienia, ale sms nie dociera do skrzynki odbiorczej wiadomości. Jakby nigdy go nie otrzymałem, tylko w mojej aplikacji. Czy istnieje sposób, aby przerwać emisję, ale odebrać wiadomości w skrzynce odbiorczej?
— pandabear

7
Należy pamiętać o nowym poziomie API 19, jak mówi @ChristopherOrr w swojej aktualizacji. Tam jest napisane "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

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


czy możemy mieć odbiornik transmisji, gdy użytkownik naciska skrzynkę odbiorczą wiadomości, abym mógł stworzyć ekran blokady ...
— Vamsi Pavan Mahesh

9

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.


2
Słuszna uwaga. Ale to powinien być komentarz, a nie odpowiedź. Czy można to przenieść? --- a co, jeśli ustawisz bardzo wysoką wartość? Jako android: priority = "9999"? na przykład? Czy próbowałeś tego?
— Felipe

4
@FelipeMicaroniLalli faktycznie GO SMS PRO, etc ... użyj 2147483647 dla ich priorytetu
— rf43

1
@DDoSAttack 2147483647 to maksimum?
— Felipe

3
Jest to największa liczba całkowita bez znaku en.wikipedia.org/wiki/Integer_(computer_science), maksymalna obsługiwana przez Androida to 999. developer.android.com/reference/android/content/ ...
— rf43

2
@NomanHamid To prawda. 999 to maksymalny priorytet. Możesz użyć dowolnej liczby, ale Android gwarantuje tylko do 999. Wszystko większe niż to i może być niestabilne lub nie i mieć niezamierzone konsekwencje. Osobiście musiałem użyć 2147483647, aby spróbować przejść przez aplikacje takie jak GO SMS PRO. Czasami działało to dla użytkowników, a czasami nie.
— 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);
    }
}

Sprawdź priorytet i ustaw wyższy priorytet (w swoim manifeście) niż inni odbiorcy.


0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.