Telefon firmowy… SMS-y z zamówieniami, potwierdzeniami, kodami – i, niestety, setki automatycznych powiadomień operatora w stylu:
Masz nieodebrane połączenia od użytkownika tego numeru (x2). Ostatnie połączenie było o godzinie 10:57 dnia 05-08-2026.
Kiedy nasz serwis nie odbiera (bo ma np. zajęte ręce naprawą waszego urządzenia), operator wysyła taką wiadomość za każdym razem. Przy telefonie firmowym, gdzie dzwoni wiele osób, tych powiadomień potrafią być tysiące – w naszym przypadku było to 1157 sztuk. Ręczne usuwanie delikatnie mówiąc było by czasochłonne, na szczęcie da się to zrobić w kilkadziesiąt sekund przez tzw. ADB. Poniżej cała procedura, komendy i gotowy skrypt.

Co to jest ADB?
ADB (Android Debug Bridge) to narzędzie z pakietu platform-tools od Google, które pozwala sterować telefonem z komputera po kablu USB. Standardowe narzędzie każdego serwisu – używamy go m.in. do diagnostyki, odzyskiwania danych i porządków w pamięci. Na telefonie trzeba włączyć Opcje deweloperskie → Debugowanie USB.
Krok po kroku
1. Podłączenie i sprawdzenie telefonu
adb devices
Widzimy naszego Samsunga w trybie device – gotowy do pracy.
2. Podgląd i zliczenie wiadomości
Baza SMS-ów jest dostępna przez tzw. content provider. Odczytujemy najnowsze wiadomości:
adb shell "content query --uri content://sms/inbox --projection _id:address:date:body:read --sort 'date DESC' | head -30"

I zliczamy pasujące do wzorca powiadomienia:
adb shell "content query --uri content://sms --projection _id --where \"body LIKE '%nieodebrane%'\" | grep -c '^Row:'"
U nas dopasowały się trzy warianty treści operatorowych:
Masz nieodebrane polaczenia...– 329 sztuk...probowal sie do Ciebie dodzwonic...– 794 sztukiUzytkownik tego numeru jest juz dostepny...– 34 sztuki
Razem 1157. Sprawdziliśmy też, że zbiory się nie nakładają (zapytanie AND zwróciło 0), więc sumę można było usuwać bezpiecznie.
Wskazówka: liczyć wiadomości trzeba przez
grep -c '^Row:', a niewc -l– SMS-y z wielolinijkową treścią zawyżają liczbę linii.
3. Test bezpieczeństwa
Przed masowym usuwaniem usunęliśmy jedną wiadomość (po ID) i zweryfikowaliśmy, że zniknęła. Zawsze warto zrobić próbę na pojedynczym rekordzie – zwłaszcza gdy operacja ma objąć tysiące wierszy.
4. Kluczowy szczegół: uprawnienia do usuwania
Samo odczytywanie SMS-ów przez ADB działa od ręki (przynajmniej na One UI 13). Usuwanie natomiast cicho nic nie robi, dopóki nie nadamy shellowi uprawnień:
adb shell "appops set com.android.shell WRITE_SMS allow" adb shell "appops set com.android.shell READ_SMS allow"
Po tym polecenie usuwania działa poprawnie:
adb shell "content delete --uri content://sms --where \"body LIKE '%nieodebrane%'\"" adb shell "content delete --uri content://sms --where \"body LIKE '%dodzwonic%'\"" adb shell "content delete --uri content://sms --where \"body LIKE '%juz dostepny%'\""
5. Weryfikacja
Po usunięciu ponawiamy zapytania zliczające — każde musi zwrócić 0. U nas potwierdzone. Zwykłe wiadomości od klientów pozostały nietknięte (sprawdziliśmy na próbce najnowszych – w trakcie operacji przyszła nawet nowa wiadomość od klientki i została na miejscu).
Automatyzacja – skrypt i harmonogram
Ponieważ powiadomienia operatora wracają (794 sztuki w ciągu kilku tygodni!), przygotowaliśmy skrypt, który robi całość: sprawdza podłączenie telefonu, nadaje uprawnienia, zlicza, usuwa i weryfikuje. W trybie cichym raportuje tylko wtedy, gdy faktycznie coś usunął – dzięki temu może działać z harmonogramu (cron), np. raz dziennie, i nie zaśmiecać logów.
#!/bin/bash
# =============================================================================
# clean_sms_notifications.sh
# Usuwa operatorowe powiadomienia o nieodebranych połączeniach z telefonu
# Samsung (One UI 13) przez ADB. Dziala tez na innych Androidach z Androidem 7+,
# jesli shell ma dostep do providera SMS.
#
# Wzorce usuwane:
# - "Masz nieodebrane polaczenia od uzytkownika tego numeru..."
# - "W trakcie rozmowy uzytkownik tego numeru probowal sie do Ciebie dodzwonic..."
# - "Uzytkownik tego numeru jest juz dostepny..."
#
# Uzycie:
# ./clean_sms_notifications.sh # pelny raport (tryb reczny)
# ./clean_sms_notifications.sh --quiet # cisza gdy nie ma nic do roboty (cron)
#
# Wyjscie: exit 0 = OK / nic do roboty, exit 1 = blad (np. cos zostalo po delete)
# =============================================================================
ADB="C:/Users/PC/Downloads/platform-tools-latest-windows/platform-tools/adb.exe"
QUIET=0
[ "$1" = "--quiet" ] && QUIET=1
say() { [ "$QUIET" -eq 0 ] && echo "$1"; }
# --- 1. Czy telefon jest podlaczony? ----------------------------------------
DEVICES=$("$ADB" devices 2>/dev/null | grep -w device | wc -l)
if [ "$DEVICES" -eq 0 ]; then
say "Telefon niepodlaczony (adb devices puste). Nic nie robie."
exit 0
fi
# --- 2. Uprawnienia shella do zapisu SMS (bez tego delete cicho nie dziala) --
"$ADB" shell "appops set com.android.shell WRITE_SMS allow" >/dev/null 2>&1
"$ADB" shell "appops set com.android.shell READ_SMS allow" >/dev/null 2>&1
# --- 3. Zliczenie przed usunieciem ------------------------------------------
N1=$("$ADB" shell "content query --uri content://sms --projection _id --where \"body LIKE '%nieodebrane%'\" | grep -c '^Row:'" 2>/dev/null)
N2=$("$ADB" shell "content query --uri content://sms --projection _id --where \"body LIKE '%dodzwonic%'\" | grep -c '^Row:'" 2>/dev/null)
N3=$("$ADB" shell "content query --uri content://sms --projection _id --where \"body LIKE '%juz dostepny%'\" | grep -c '^Row:'" 2>/dev/null)
[ -z "$N1" ] && N1=0; [ -z "$N2" ] && N2=0; [ -z "$N3" ] && N3=0
TOTAL=$((N1 + N2 + N3))
if [ "$TOTAL" -eq 0 ]; then
say "Brak powiadomien operatora — skrzynka czysta."
exit 0
fi
# --- 4. Usuniecie ------------------------------------------------------------
"$ADB" shell "content delete --uri content://sms --where \"body LIKE '%nieodebrane%'\"" >/dev/null 2>&1
"$ADB" shell "content delete --uri content://sms --where \"body LIKE '%dodzwonic%'\"" >/dev/null 2>&1
"$ADB" shell "content delete --uri content://sms --where \"body LIKE '%juz dostepny%'\"" >/dev/null 2>&1
# --- 5. Weryfikacja ----------------------------------------------------------
V1=$("$ADB" shell "content query --uri content://sms --projection _id --where \"body LIKE '%nieodebrane%'\" | grep -c '^Row:'" 2>/dev/null)
V2=$("$ADB" shell "content query --uri content://sms --projection _id --where \"body LIKE '%dodzwonic%'\" | grep -c '^Row:'" 2>/dev/null)
V3=$("$ADB" shell "content query --uri content://sms --projection _id --where \"body LIKE '%juz dostepny%'\" | grep -c '^Row:'" 2>/dev/null)
[ -z "$V1" ] && V1=0; [ -z "$V2" ] && V2=0; [ -z "$V3" ] && V3=0
VTOTAL=$((V1 + V2 + V3))
if [ "$VTOTAL" -eq 0 ]; then
echo "OK: usunieto $TOTAL powiadomien operatora (nieodebrane: $N1, dodzwonic: $N2, dostepny: $N3). Zweryfikowano: 0 pozostalo."
exit 0
else
echo "UWAGA: po usunieciu pozostalo $VTOTAL wierszy (przed: $TOTAL). Sprawdz recznie."
exit 1
fi
# ręcznie, pełny raport ./clean_sms_notifications.sh # z harmonogramu, cicho ./clean_sms_notifications.sh --quiet
Skrypt zawsze kończy się kodem wyjścia 0 (sukces / nic do roboty) albo 1 (coś zostało – do ręcznej kontroli), więc można go podpiąć pod monitoring.
Bezpieczeństwo i prywatność
- Usuwamy wyłącznie wiadomości pasujące do wzorców operatorowych – żadnych wiadomości od klientów.
- Przed masowym usuwaniem robimy test na jednej wiadomości i weryfikujemy wynik.
- Lista usuniętych ID zapisywana jest do pliku jako ślad operacji.
Podsumowanie
1157 wiadomości mniej w skrzynce, a cała operacja – zajęła mniej czasu niż ręczne usuwanie 20 wiadomości. 🙂
