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)
}
}
В примере delegate сообщает 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также