TalkBack — це вбудований екранний диктор (screen reader) від Google для Android, що входить до складу пакету Android Accessibility Suite. Він озвучує елементи інтерфейсу та дозволяє керувати пристроєм за допомогою жестів, надаючи незрячим та слабозорим користувачам повноцінний доступ до функцій смартфона. Згідно з Google Accessibility Help (2025), TalkBack попередньо встановлений на більшості Android-пристроїв та підтримує понад 30 мов із різними голосовими рушіями.
Головне
TalkBack — це екранний диктор (screen reader) для Android, розроблений Google і що входить до складу Android Accessibility Suite. Він забезпечує голосовий зворотний зв’язок та керування жестами для користувачів із порушеннями зору. TalkBack працює на смартфонах, планшетах, Smart TV та носимих пристроях на Wear OS.
TalkBack вперше з’явився в Android 1.6 (Donut) у 2009 році. Спочатку це був окремий проект, але з виходом Android 4.0 (Ice Cream Sandwich) він став частиною Android Accessibility Suite — набору сервісів, який також включає Switch Access та Select to Speak. Починаючи з Android 10, TalkBack попередньо встановлений на всіх пристроях із сервісами Google Play, включаючи пристрої партнерів — Samsung, Xiaomi, Oppo та інші.
TalkBack підтримує понад 30 мов із різними голосовими рушіями: Google Text-to-Speech, Samsung TTS та сторонні. Для української мови Google TTS забезпечує природну вимову та правильну інтонацію. Користувач може налаштувати швидкість мовлення, висоту тону та вибрати стать голосу в налаштуваннях TalkBack.
TalkBack працює на основі AccessibilityService — системного механізму Android, який дозволяє додаткам отримувати інформацію про стан інтерфейсу та програмно взаємодіяти з ним. Коли TalkBack увімкнений, він перехоплює всі події дотику та трансформує їх у спеціальні жести screen reader’а.
Ключовий елемент роботи TalkBack — фокус доступності (accessibility focus). На відміну від стандартного фокусу введення, який видний як виділення текстового поля, фокус доступності відображається жовтим рамком навколо елемента та невидний для користувачів без TalkBack. Коли фокус доступності потрапляє на елемент, TalkBack озвучує його вміст, тип та стан.
Користувач переміщує фокус доступності жестами: проведення вправо — наступний елемент, проведення вліво — попередній елемент. Елементи обходяться в порядку, визначеному AccessibilityNodeInfo — деревом доступності, яке Android будує для кожного екрану. Розробник може впливати на порядок через властивості accessibilityTraversalBefore та accessibilityTraversalAfter, що особливо важливо для складних екранів із кастомним компонуванням.
Кожний View на екрані представлений вузлом в дереві доступності — об’єктом AccessibilityNodeInfo. Цей об’єкт містить: текст елемента (contentDescription або текст view), тип елемента (кнопка, прапорець, поле введення), стан (увімкнено/вимкнено/вибрано), позицію на екрані та список доступних дій. TalkBack обходить це дерево та озвучує кожний вузол в порядку обходу.
Якщо View не має текстового вмісту (наприклад, ImageView без опису), він стає невидимим для TalkBack — користувач не дізнається про його існування. Для вирішення цієї проблеми розробник задає contentDescription — текстовий опис, який TalkBack вимовляє замість тиші. Android також підтримує stateDescription для елементів зі змінним станом (вибрано/не вибрано) та hintText для полів введення з підказкою.
TalkBack перетворює стандартні жести Android у спеціальні жести screen reader’а. Більшість операцій виконується одним або двома пальцями, причому жести трьома пальцями зарезервовані для глобальних дій.
| Дія | Жест | Результат |
|---|---|---|
| Озвучити елемент | Дотик 1 пальцем | Вимовляє назву та тип елемента |
| Активувати | Подвійне дотикання | Натиснення кнопки або перехід |
| Наступний | Проведення вправо | Наступний елемент |
| Попередній | Проведення вліво | Попередній елемент |
| Прокрутка | 2 пальцями проведення | Прокрутка списку |
| Меню TalkBack | Проведення вгору-вліво | Глобальне меню налаштувань |
Жест проведення вгору-вліво (L-подібний проведення) відкриває глобальне меню TalkBack, де користувач може змінити швидкість мовлення, увімкнути екранну шторку, запустити навчальний посібник або відкрити налаштування. TalkBack також підтримує контекстне меню для елементів: проведення вгору-вправо відкриває список доступних дій для поточного елемента (наприклад, «скопіювати», «вставити» для текстового поля або «видалити» для повідомлення в чаті).
Android надає багатий API для налаштування доступності. Базовий рівень — contentDescription, але для якісної підтримки TalkBack потрібна робота з AccessibilityNodeInfo, AccessibilityDelegate та LiveRegion.
Атрибут android:contentDescription задає текстовий опис елемента для TalkBack. Він обов’язковий для ImageView, ImageButton, FloatingActionButton та будь-яких кастомних View без текстового вмісту. Для стандартних елементів (TextView, Button) contentDescription необов’язковий — TalkBack прочитає текст автоматично.
val avatarView = ImageView(this)
avatarView.contentDescription = "Аватар користувача"
avatarView.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_YES
val playButton = ImageButton(this)
playButton.contentDescription = "Відтворити відео"
val progressBar = ProgressBar(this)
progressBar.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_NO
Флаг importantForAccessibility керує видимістю елемента для TalkBack. Значення NO приховує елемент з дерева доступності — корисно для декоративних зображень, індикаторів та кастомних фонів. Значення YES примусово включає елемент в обхід, навіть якщо він не має тексту. Важливо не зловживати NO: приховування семантично важливих елементів робить додаток недоступним для користувачів TalkBack.
Для кастомних View, які не використовують стандартні обробники кліків, необхідно перевизначити AccessibilityDelegate — клас, який обробляє події доступності. Делегат дозволяє задати кастомний опис, тип елемента та список доступних дій, які TalkBack запропонує користувачеві через контекстне меню.
class CustomButtonDelegate : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(
host: View, info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = "Кастомна кнопка"
info.className = Button::class.java.name
info.addAction(
AccessibilityNodeInfoCompat.AccessibilityActionCompat(
R.id.custom_action, "Поділитися"
)
)
}
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)
}
}
У прикладі делегат повідомляє TalkBack, що елемент є кнопкою (className = Button) та надає кастомну дію «Поділитися», яка з’явиться в контекстному меню TalkBack. Метод performAccessibilityAction обробляє виклик цієї дії. Без делегата TalkBack сприймав би кастомний View як просту неінтерактивну область, і користувач не зміг би взаємодіяти з ним.
Повноцінна підтримка TalkBack включає не тільки contentDescription, але й керування фокусом, LiveRegion для динамічних оновлень, тестування з увімкненим screen reader’ом та адаптацію для різних версій Android.
Коли вміст екрану змінюється без явної дії користувача (наприклад, з’являється сповіщення про нове повідомлення або оновлюється лічильник лайків), TalkBack повинен отримати сповіщення. Для цього використовується атрибут android:accessibilityLiveRegion для View у XML або метод setAccessibilityLiveRegion() у коді. Значення polite додає оголошення після завершення поточного озвучення, а assertive — негайно перериває його.
val statusText = TextView(this)
statusText.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_POLITE
// При оновленні тексту TalkBack автоматично
// оголосить зміну
statusText.text = "Нове повідомлення від Анни"
// Для критичних сповіщень — assertive
errorBanner.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE
LiveRegion — це аналог UIAccessibility.post на iOS. Використовуйте polite для більшості оновлень (нові повідомлення, оновлення статусу) та assertive тільки для критичних помилок (невдала оплата, втрата з’єднання). Надмірне використання assertive створює негативний користувацький досвід — TalkBack постійно перериватиме поточне озвучення.
Для складних екранів, де кілька View утворюють одну логічну одиницю, використовується AccessibilityNodeProvider або focusSearch для перевизначення навігації. Наприклад, кастомний календар із 42 комірок (6 тижнів × 7 днів) не повинен змушувати користувача прогортати всі 42 елементи, щоб перейти до наступного блоку. Розробник може об’єднати комірки в логічні групи: місяць → тиждень → день.
Для Jetpack Compose використовується модифікатор .semantics {}, який надає аналогічний API: contentDescription, liveRegion, stateDescription, disabled та customActions. Compose також підтримує mergeDescendants для об’єднання дочірних семантик в одну, що спрощує групування елементів без ручного налаштування accessibilityDelegate для кожного View.
Button(
onClick = { sendMessage() },
modifier = Modifier.semantics {
contentDescription("Надіслати повідомлення")
stateDescription("Готово до відправлення")
}
) {
Icon(Icons.Filled.Send, "Надіслати")
}
Тестування TalkBack виконується через фізичний пристрій або емулятор з увімкненим сервісом. Рекомендується пройти ключові користувацькі сценарії з вимкненим екраном (Screen Curtain) — це симулює повну відсутність візуального зворотного зв’язку. Android також надає Accessibility Scanner — інструмент для автоматичного виявлення проблем доступності, який підсвічує елементи без contentDescription, занадто малі області дотику та низький контраст.
Часто задавані питання
Налаштування → Спеціальні можливості → TalkBack → Увімкнути. Для швидкого увімкнення використовується одночасне натискання обох клавіш гучності протягом 3 секунд. Google Assistant також може увімкнути TalkBack за голосовою командою «Увімкни TalkBack».
TalkBack — screen reader для Android, VoiceOver — для iOS. TalkBack використовує AccessibilityService та фокус доступності з жовтим рамком, а VoiceOver — UIAccessibility та ротор. Жести та меню відрізняються: у TalkBack є L-подібні проведення для глобального меню.
Задайте contentDescription для всіх ImageView та кастомних елементів. Використовуйте importantForAccessibility для приховування декоративних елементів. Налаштуйте accessibilityLiveRegion для динамічних оновлень та перевірте через Accessibility Scanner. У Compose застосовуйте модифікатор .semantics{}.
Це об’єкт, що представляє елемент інтерфейсу в дереві доступності. Містить текст, тип, стан, позицію та список дій. TalkBack обходить це дерево для навігації. Розробник може змінювати його через AccessibilityDelegate або атрибути в XML.
Перевірте importantForAccessibility — можливо, він встановлений в NO. Переконайтеся, що contentDescription задано для елементів без тексту. Для кастомних View реалізуйте AccessibilityDelegate з onInitializeAccessibilityNodeInfo. Використовуйте Accessibility Scanner для діагностики.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також