TalkBack — wbudowany czytnik ekranowy (screen reader) firmy Google dla systemu Android, wchodzący w skład pakietu Android Accessibility Suite. Odczytuje elementy interfejsu i umożliwia sterowanie urządzeniem za pomocą gestów, zapewniając niewidomym i słabowidzącym użytkownikom pełny dostęp do funkcji smartfona. Według Google Accessibility Help (2025), TalkBack jest preinstalowany na większości urządzeń z Androidem i obsługuje ponad 30 języków z różnymi silnikami głosowymi.
Najważniejsze
TalkBack — to czytnik ekranowy (screen reader) dla Androida, opracowany przez Google i wchodzący w skład Android Accessibility Suite. Zapewnia informację głosową i sterowanie gestami dla użytkowników z zaburzeniami wzroku. TalkBack może działać zarówno na smartfonach, jak i tabletach, Smart TV oraz urządzeniach noszonych na Wear OS.
TalkBack po raz pierwszy pojawił się w Android 1.6 (Donut) w 2009 roku. Początkowo był to osobny projekt, ale wraz z wydaniem Android 4.0 (Ice Cream Sandwich) stał się częścią Android Accessibility Suite — zestawu usług obejmującego również Switch Access i Select to Speak. Od Androida 10 TalkBack jest preinstalowany na wszystkich urządzeniach z usługami Google Play, w tym u partnerów — Samsung, Xiaomi, Oppo i innych.
TalkBack obsługuje ponad 30 języków z różnymi silnikami głosowymi: Google Text-to-Speech, Samsung TTS i innymi. Dla języka polskiego używany jest silnik głosowy Google TTS, który zapewnia naturalną wymowę i prawidłową intonację. Użytkownik może dostosować szybkość mowy, wysokość tonu i wybrać płeć głosu w ustawieniach TalkBack.
TalkBack działa w oparciu o usługę dostępności (AccessibilityService) — mechanizm systemowy Androida, który pozwala aplikacjom uzyskiwać informacje o stanie interfejsu i programowo z nim współdziałać. Gdy TalkBack jest włączony, przechwytuje wszystkie zdarzenia dotknięcia i przekształca je w specjalne gesty czytnika ekranowego.
Kluczowym elementem działania TalkBack jest fokus dostępności (accessibility focus). W przeciwieństwie do standardowego fokusa wejścia, który jest widoczny jako podświetlenie pola tekstowego, fokus dostępności wyświetlany jest żółtą ramką wokół elementu i jest niewidoczny dla użytkownika bez TalkBack. Gdy fokus dostępności trafi na element, TalkBack odczytuje jego zawartość, typ i stan.
Użytkownik przesuwa fokus dostępności gestami: przesunięcie w prawo — następny element, przesunięcie w lewo — poprzedni. Elementy są przeglądane w kolejności określonej przez AccessibilityNodeInfo — drzewo dostępności, które Android buduje dla każdego ekranu. Programista może wpływać na kolejność poprzez właściwości accessibilityTraversalBefore i accessibilityTraversalAfter, co jest szczególnie ważne w przypadku złożonych ekranów z niestandardowym układem.
Każdy View na ekranie jest reprezentowany przez węzeł w drzewie dostępności — obiekt AccessibilityNodeInfo. Ten obiekt zawiera: tekst elementu (contentDescription lub tekst widoku), typ elementu (przycisk, pole wyboru, pole wprowadzania), stan (włączony/wyłączony/zaznaczony), pozycję na ekranie oraz listę dostępnych akcji. TalkBack przegląda to drzewo i odczytuje każdy węzeł w kolejności przeglądania.
Jeśli View nie ma zawartości tekstowej (np. ImageView bez opisu), staje się niewidoczny dla TalkBack — użytkownik nie dowie się o jego istnieniu. Aby rozwiązać ten problem, programista ustawia contentDescription — tekstowy opis, który TalkBack wypowiada zamiast pustki. Android obsługuje również stateDescription dla elementów ze zmiennym stanem (zaznaczony/niezaznaczony) oraz hintText dla pól wprowadzania z podpowiedzią.
TalkBack przekształca standardowe gesty Androida w specjalne gesty czytnika ekranowego. Większość operacji wykonuje się jednym lub dwoma palcami, przy czym gesty trzema palcami są zarezerwowane dla działań globalnych.
| Akcja | Gesty | Rezultat |
|---|---|---|
| Odczytaj element | Dotknięcie 1 palcem | Wypowiada nazwę i typ elementu |
| Aktywuj | Podwójne dotknięcie | Naciśnięcie przycisku lub przejście |
| Następny | Przesunięcie w prawo | Następny element |
| Poprzedni | Przesunięcie w lewo | Poprzedni element |
| Przewijanie | 2 palce przesunięcie | Przewijanie listy |
| Menu TalkBack | Przesunięcie w górę-w lewo | Globalne menu ustawień |
Gesty „przesunięcie w górę-w lewo” (przesunięcie w kształcie L) otwiera globalne menu TalkBack, w którym użytkownik może zmienić szybkość mowy, włączyć przesłonę ekranu, uruchomić samouczek lub otworzyć ustawienia. TalkBack obsługuje również menu kontekstowe dla elementów: przesunięcie w górę-w prawo otwiera listę dostępnych akcji dla bieżącego elementu (np. „kopiuj”, „wklej” dla pola tekstowego lub „usuń” dla wiadomości na czacie).
Android udostępnia bogate API do konfiguracji dostępności. Podstawowym poziomem jest contentDescription, ale dla wysokiej jakości obsługi TalkBack wymagana jest praca z AccessibilityNodeInfo, AccessibilityDelegate i LiveRegion.
Atrybut android:contentDescription ustawia tekstowy opis elementu dla TalkBack. Jest obowiązkowy dla ImageView, ImageButton, FloatingActionButton i wszelkich niestandardowych widoków bez zawartości tekstowej. Dla standardowych elementów (TextView, Button) contentDescription jest opcjonalny — TalkBack odczyta tekst automatycznie.
val avatarView = ImageView(this)
avatarView.contentDescription = "Awatar użytkownika"
avatarView.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_YES
val playButton = ImageButton(this)
playButton.contentDescription = "Odtwórz wideo"
val progressBar = ProgressBar(this)
progressBar.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_NO
Flaga importantForAccessibility steruje widocznością elementu dla TalkBack. Wartość NO ukrywa element z drzewa dostępności — przydatne dla dekoracyjnych obrazów, wskaźników i niestandardowych teł. Wartość YES wymusza włączenie elementu do przeglądania, nawet jeśli nie ma tekstu. Ważne, aby nie nadużywać NO: ukrywanie semantycznie ważnych elementów czyni aplikację niedostępną dla użytkowników TalkBack.
Dla niestandardowych widoków, które nie używają standardowych procedur obsługi kliknięć, należy przesłonić AccessibilityDelegate — klasę obsługującą zdarzenia dostępności. Delegat umożliwia ustawienie niestandardowego opisu, typu elementu i listy dostępnych akcji, które TalkBack zaproponuje użytkownikowi w menu kontekstowym.
class CustomButtonDelegate : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(
host: View, info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = "Niestandardowy przycisk"
info.className = Button::class.java.name
info.addAction(
AccessibilityNodeInfoCompat.AccessibilityActionCompat(
R.id.custom_action, "Udostępnij"
)
)
}
override fun performAccessibilityAction(
host: View, action: Int, args: Bundle?
): Boolean {
if (action == R.id.custom_action) {
shareContent()
return true
}
return super.performAccessibilityAction(host, action, args)
}
}
W przykładzie delegate informuje TalkBack, że element jest przyciskiem (className = Button) i udostępnia niestandardową akcję „Udostępnij”, która pojawi się w menu kontekstowym TalkBack. Metoda performAccessibilityAction obsługuje wywołanie tej akcji. Bez delegata TalkBack odebrałby niestandardowy widok jako zwykły obszar bez interaktywności, a użytkownik nie mógłby z nim współdziałać.
Pełna obsługa TalkBack obejmuje nie tylko contentDescription, ale także zarządzanie fokusem, LiveRegion dla dynamicznych aktualizacji, testowanie z włączonym czytnikiem ekranowym i dostosowanie do różnych wersji Androida.
Gdy zawartość ekranu zmienia się bez jawnego działania użytkownika (np. pojawia się powiadomienie o nowej wiadomości lub aktualizuje się licznik polubień), TalkBack powinien otrzymać powiadomienie. W tym celu używa się atrybutu android:accessibilityLiveRegion dla View w XML lub metody setAccessibilityLiveRegion() w kodzie. Wartość polite dodaje ogłoszenie po zakończeniu bieżącego odczytywania, a wartość assertive natychmiast je przerywa.
val statusText = TextView(this)
statusText.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_POLITE
// Po aktualizacji tekstu TalkBack automatycznie
// ogłosi zmianę
statusText.text = "Nowa wiadomość od Anny"
// W przypadku krytycznych powiadomień — assertive
errorBanner.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE
LiveRegion — to odpowiednik UIAccessibility.post na iOS. Używaj polite dla większości aktualizacji (nowe wiadomości, aktualizacja statusu) i assertive tylko dla krytycznych błędów (nieudana płatność, utrata połączenia). Nadmierne użycie assertive tworzy negatywne doświadczenie użytkownika — TalkBack będzie stale przerywać bieżące odczytywanie.
W przypadku złożonych ekranów, gdzie kilka widoków tworzy jedną logiczną jednostkę, używa się AccessibilityNodeProvider lub focusSearch do nadpisania nawigacji. Na przykład niestandardowy kalendarz z 42 komórkami (6 tygodni × 7 dni) nie powinien zmuszać użytkownika do przewijania wszystkich 42 elementów, aby przejść do następnego bloku. Programista może połączyć komórki w logiczne grupy: miesiąc → tydzień → dzień.
Dla Jetpack Compose używany jest modyfikator .semantics {}, który udostępnia podobne API: contentDescription, liveRegion, stateDescription, disabled i customActions. Compose obsługuje również mergeDescendants do łączenia semantyk potomnych w jedną, co upraszcza grupowanie elementów bez ręcznej konfiguracji accessibilityDelegate dla każdego widoku.
Button(
onClick = { sendMessage() },
modifier = Modifier.semantics {
contentDescription("Wyślij wiadomość")
stateDescription("Gotowe do wysłania")
}
) {
Icon(Icons.Filled.Send, "Wyślij")
}
Testowanie TalkBack wykonuje się przez fizyczne urządzenie lub emulator z włączoną usługą. Zaleca się przejście kluczowych scenariuszy użytkownika z wyłączonym ekranem (Screen Curtain) — to symuluje całkowity brak wizualnej informacji zwrotnej. Android udostępnia również Accessibility Scanner — narzędzie do automatycznego wykrywania problemów z dostępnością, które podświetla elementy bez contentDescription, zbyt małe obszary dotyku i niski kontrast.
Często zadawane pytania
Ustawienia → Dostępność → TalkBack → Włącz. Do szybkiego włączenia używa się jednoczesnego naciśnięcia obu klawiszy głośności na 3 sekundy. Google Assistant może również włączyć TalkBack za pomocą komendy głosowej „Włącz TalkBack”.
TalkBack — czytnik ekranowy dla Androida, VoiceOver — dla iOS. TalkBack używa AccessibilityService i fokusa dostępności z żółtą ramką, a VoiceOver — UIAccessibility i rotora. Gesty i menu różnią się: TalkBack ma przesunięcia w kształcie L dla menu globalnego.
Ustaw contentDescription dla wszystkich ImageView i elementów niestandardowych. Użyj importantForAccessibility do ukrywania elementów dekoracyjnych. Skonfiguruj accessibilityLiveRegion dla dynamicznych aktualizacji i sprawdź przez Accessibility Scanner. W Compose stosuj modyfikator .semantics{}.
To obiekt reprezentujący element interfejsu w drzewie dostępności. Zawiera tekst, typ, stan, pozycję i listę akcji. TalkBack przegląda to drzewo do nawigacji. Programista może je modyfikować przez AccessibilityDelegate lub atrybuty w XML.
Sprawdź importantForAccessibility — być może jest ustawiony na NO. Upewnij się, że contentDescription jest ustawiony dla elementów bez tekstu. Dla niestandardowych widoków zaimplementuj AccessibilityDelegate z onInitializeAccessibilityNodeInfo. Użyj Accessibility Scanner do diagnostyki.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również