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?

umakant
źródło
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

Christopher Orr
źródło
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

Sunil Kumar Sahoo
źródło
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.

Subba
źródło
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.

taran mahal
źródło
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.

Pir Fahim Shah
źródło