W telefonach z systemem Android wiadomości SMS zarejestrowane w aplikacjach są również wysyłane do skrzynki odbiorczej urządzenia. Jednak aby uniknąć bałaganu, dobrze byłoby móc usunąć ze skrzynki odbiorczej wiadomości SMS specyficzne dla aplikacji, aby zmniejszyć potencjalne przepełnienie tych wiadomości.
Pytania w innych grupach dyskusyjnych Google dotyczące uzyskania ostatecznej odpowiedzi na temat programowego sposobu usuwania wiadomości SMS ze skrzynki odbiorczej Androida nie wydają się pilne.
A więc scenariusz:
- Uruchomienie aplikacji na Androida.
- zarejestrować typy wiadomości SMS X, Y i Z
- wiadomości P, Q, X, Y, Z z biegiem czasu są przesyłane do skrzynki odbiorczej
- Aplikacja na Androida wykrywa odebranie X, Y, Z (prawdopodobnie w ramach zdarzenia przerwania programu)
- proces X, Y, Z
- Pożądanie !!! X, Y, Z są usuwane ze skrzynki odbiorczej Androida
Czy to się stało? Czy da się to zrobić?
Odpowiedzi:
„Począwszy od systemu Android 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 wskazać systemowi, które komponenty powinny odebrać transmisję jako pierwsze.”Oznacza to, że możesz przechwycić przychodzącą wiadomość i przerwać jej nadawanie.
W
AndroidManifest.xml
pliku upewnij się, że masz ustawiony najwyższy priorytet:W twojej
BroadcastReceiver
, wonReceive()
metodzie przed wykonaniem coś z wiadomości, wystarczy zadzwonićabortBroadcast();
EDYCJA: Od KitKat, to już najwyraźniej nie działa.
EDIT2: Więcej informacji o tym, jak to zrobić na KitKat tutaj:
Usuń SMS-y z Androida w wersji 4.4.4 (wiersze, których dotyczy problem = 0 (zero), po usunięciu)
źródło
Korzystając z sugestii innych, myślę, że udało mi się:
(przy użyciu SDK v1 R2)
Nie jest doskonały, ponieważ muszę usunąć całą rozmowę, ale dla naszych celów jest to wystarczający kompromis, ponieważ przynajmniej będziemy wiedzieć, że wszystkie wiadomości zostaną przejrzane i zweryfikowane. Nasz przepływ prawdopodobnie będzie musiał następnie nasłuchiwać wiadomości, przechwytywać wiadomość, którą chcemy, wykonać zapytanie, aby uzyskać identyfikator wątku ostatnio odebranej wiadomości i wykonać wywołanie delete ().
W naszej działalności:
Uwaga: nie udało mi się usunąć treści: // sms / inbox / lub content: // sms / all /
Wygląda na to, że wątek ma pierwszeństwo, co ma sens, ale komunikat o błędzie tylko ośmielił mnie, żebym był bardziej zły. Próbując usunąć na sms / inbox / lub sms / all /, prawdopodobnie otrzymasz:
Aby uzyskać dodatkowe informacje, umieść to w swoim manifeście dla swojego odbiorcy:
Zauważ, że tag odbiornika nie wygląda tak:
Kiedy miałem te ustawienia, Android dał mi szalone wyjątki uprawnień, które nie pozwalały android.phone na przekazywanie odebranych SMS-ów zgodnie z moim zamiarem. Więc NIE umieszczaj tego atrybutu uprawnienia RECEIVE_SMS w swojej intencji! Mam nadzieję, że ktoś mądrzejszy ode mnie może mi powiedzieć, dlaczego tak się stało.
źródło
Tak, miałem grać, i to jest możliwe, aby usunąć odebrany SMS. Niestety nie wszystko jest proste :(
Mam odbiornik, który odbiera przychodzące wiadomości SMS. Sposób, w jaki działa routing przychodzący SMS na Androida polega na tym, że fragment kodu odpowiedzialny za dekodowanie wiadomości wysyła Broadcast (używa
sendBroadcast()
metody - która niestety NIE jest wersją, która pozwala po prostu zadzwonićabortBroadcast()
) za każdym razem, gdy nadejdzie wiadomość.Mój odbiorca może, ale nie musi, zostać wywołany przed systemowym odbiornikiem SMS, aw każdym przypadku odebrana transmisja nie ma właściwości, która mogłaby odzwierciedlać
_id
kolumnę w tabeli SMS.Jednak nie będąc osobą, której można tak łatwo zatrzymać, wysyłam sobie (za pośrednictwem Handlera) opóźnioną wiadomość z SmsMessage jako dołączonym obiektem. (Przypuszczam, że możesz też opublikować Runnable ...)
Opóźnienie ma na celu zapewnienie, że do czasu nadejścia wiadomości wszyscy odbiorcy rozgłoszeń zakończą pracę i wiadomość zostanie bezpiecznie umieszczona w tabeli SMS.
Kiedy otrzymam wiadomość (lub Runnable), oto co robię:
Używam adresu źródłowego i pola znacznika czasu, aby zapewnić bardzo wysokie prawdopodobieństwo usunięcia TYLKO interesującej mnie wiadomości. Gdybym chciał być jeszcze bardziej paranoikiem, mógłbym dołączyć
msg.getMessageBody()
treść jako część zapytania.Tak, wiadomość JEST usunięta (hura!). Niestety pasek powiadomień nie jest aktualizowany :(
Po otwarciu obszaru powiadomień zobaczysz wiadomość tam dla Ciebie ... ale kiedy ją dotkniesz, aby ją otworzyć - zniknęła!
Dla mnie to nie jest wystarczająco dobre - chcę, aby wszystkie ślady wiadomości zniknęły - nie chcę, aby użytkownik myślał, że istnieje TXT, gdy go nie ma (spowodowałoby to tylko raporty o błędach).
Wewnętrznie w systemie operacyjnym połączenia telefoniczne
MessagingNotification.updateNewMessageIndicator(Context)
, ale ja ta klasa została ukryta przed API i nie chciałem replikować całego tego kodu tylko po to, aby wskaźnik był dokładny.źródło
użyj tego uprawnienia w AndroidManifiest
źródło
Lepiej jest użyć _id i thread_id do usunięcia wiadomości.
Thread_id to coś przypisanego do wiadomości pochodzących od tego samego użytkownika. Jeśli więc użyjesz tylko thread_id, wszystkie wiadomości od nadawcy zostaną usunięte.
Jeśli użyjesz kombinacji _id, thread_id, usunie to dokładnie tę wiadomość, którą chcesz usunąć.
źródło
Musisz znaleźć identyfikator URI wiadomości. Ale kiedy już to zrobisz, myślę, że powinieneś być w stanie android.content.ContentResolver.delete (...) to.
Oto więcej informacji .
źródło
Myślę, że na razie nie można tego doskonale zrobić. Istnieją 2 podstawowe problemy:
Jak możesz upewnić się, że SMS jest już w skrzynce odbiorczej, gdy próbujesz go usunąć?
Zwróć uwagę, że SMS_RECEIVED nie jest zamówioną transmisją.
Tak więc rozwiązaniem Dmyunga jest próba szczęścia; nawet opóźnienie w odpowiedzi Douga nie jest gwarancją.
SmsProvider nie jest bezpieczny dla wątków. (Patrz http://code.google.com/p/android/issues/detail?id=2916#c0 )
Fakt, że więcej niż jeden klient żąda usunięcia i wstawienia do niego w w tym samym czasie spowoduje uszkodzenie danych lub nawet natychmiastowy wyjątek w czasie wykonywania.
źródło
Nie mogłem zmusić go do pracy przy użyciu rozwiązania dmyung, dał mi wyjątek podczas uzyskiwania identyfikatora wiadomości lub identyfikatora wątku.
W końcu użyłem następującej metody, aby uzyskać identyfikator wątku:
Wtedy mogłem go usunąć. Jednak, jak powiedział Doug, powiadomienie nadal tam jest, nawet komunikat jest wyświetlany podczas otwierania panelu powiadomień. Dopiero stukając w wiadomość mogłem faktycznie zobaczyć, że jest pusty.
Więc wydaje mi się, że jedynym sposobem, aby to zadziałało, byłoby przechwycenie wiadomości SMS, zanim zostanie ona dostarczona do systemu, zanim dotrze nawet do skrzynki odbiorczej. Jednak bardzo wątpię, że jest to wykonalne. Proszę popraw mnie jeżeli się mylę.
źródło
Użyj tej funkcji, aby usunąć określony wątek wiadomości lub zmodyfikować go zgodnie ze swoimi potrzebami:
Wywołaj tę funkcję poniżej:
Nie zapomnij dodać poniżej uprawnień do głównego festiwalu Androida:
źródło
Po prostu wyłącz powiadomienia dla domyślnej aplikacji sms. Przetwarzaj własne powiadomienia dla wszystkich wiadomości tekstowych!
źródło
Wystarczy spojrzeć na ten link, który da ci krótki pogląd na logikę:
https://gist.github.com/5178e798d9a00cac4ddb
Po prostu wywołaj funkcję deleteSMS () z pewnym opóźnieniem, ponieważ istnieje niewielka różnica między czasem powiadomienia i kiedy faktycznie jest zapisywane ...., po szczegóły zajrzyj pod ten link również ..........
http://htmlcoderhelper.com/how-to-delete-sms-from- inbox-in-android-programmatically /
Thanks ..........
źródło
Po prostu wypróbuj poniższy kod, aby usunąć wszystkie SMS-y, które są w telefonie (odebrane lub wysłane)
źródło
Zaktualizuj również plik manifestu, aby usunąć sms, którego potrzebujesz do zapisu.
źródło
abortBroadcast();
Metoda Now może służyć do ograniczenia przychodzącej wiadomości do skrzynki odbiorczej.źródło
Przykład usunięcia jednego SMS-a, a nie rozmowy:
źródło
źródło
Spróbuj tego jestem w 100% pewien, że to zadziała dobrze: - // po prostu wpisz tutaj adres konwersji, aby usunąć całą konwersję według adresu (nie zapomnij dodać uprawnień do odczytu i zapisu w mainfest) Oto kod:
źródło
Użyj jednej z tych metod, aby wybrać ostatnio otrzymany SMS i usunąć go, tutaj w tym przypadku otrzymuję najwięcej smsów i zamierzam usunąć za pomocą wątku i wartości identyfikatora sms,
źródło