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 е включен, той прихваща всички събития на докосване и ги трансформира в специални жестове на екранния четец.
Ключовият елемент на работата на TalkBack — фокус на достъпност (accessibility focus). За разлика от стандартния фокус на въвеждане, който е видим като подчертаване на текстово поле, фокусът на достъпност се показва като жълта рамка около елемента и е невидим за потребителя без TalkBack. Когато фокусът на достъпност попадне на елемент, TalkBack озвучава неговото съдържание, тип и състояние.
Потребителят премества фокуса на достъпност с жестове: плъзгане надясно — следващ елемент, плъзгане наляво — предишен елемент. Елементите се обхождат в реда, определен от AccessibilityNodeInfo — дървото на достъпност, което Android изгражда за всеки екран. Разработчикът може да влияе на реда чрез свойствата accessibilityTraversalBefore и accessibilityTraversalAfter, което е особено важно за сложни екрани с персонализирано оформление.
Всеки View на екрана е представен от възел в дървото на достъпност — обект AccessibilityNodeInfo. Този обект съдържа: текст на елемента (contentDescription или текст на view), тип на елемента (бутон, квадратче за отметка, поле за въвеждане), състояние (включено/изключено/избрано), позиция на екрана и списък с налични действия. TalkBack обхожда това дърво и озвучава всеки възел в реда на обхождане.
Ако View няма текстово съдържание (например ImageView без описание), става невидим за TalkBack — потребителят няма да разбере за съществуването му. За разрешаване на този проблем разработчикът задава contentDescription — текстово описание, което TalkBack произнася вместо тишина. Android също поддържа stateDescription за елементи с променливо състояние (избрано/неизбрано) и hintText за полета за въвеждане с подсказка.
TalkBack преобразува стандартните Android жестове в специални жестове на екранния четец. Повечето операции се извършват с един или два пръста, като жестовете с три пръста са запазени за глобални действия.
| Действие | Жест | Резултат |
|---|---|---|
| Озвучи елемент | Докосване с 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 за динамични актуализации, тестване с включен екранен четец и адаптиране към различни версии на 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 — екранен четец за 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също