TalkBack es un lector de pantalla integrado de Google para Android, que forma parte del paquete Android Accessibility Suite. Narra los elementos de la interfaz y permite controlar el dispositivo mediante gestos, brindando a los usuarios ciegos y con discapacidad visual acceso completo a las funciones del teléfono. Según Google Accessibility Help (2025), TalkBack viene preinstalado en la mayoría de los dispositivos Android y admite más de 30 idiomas con diferentes motores de voz.
Puntos clave
TalkBack es un lector de pantalla para Android, desarrollado por Google y que forma parte de Android Accessibility Suite. Proporciona retroalimentación de voz y control por gestos para usuarios con discapacidad visual. TalkBack funciona en teléfonos inteligentes, tabletas, Smart TV y dispositivos portátiles con Wear OS.
TalkBack apareció por primera vez en Android 1.6 (Donut) en 2009. Inicialmente era un proyecto separado, pero con el lanzamiento de Android 4.0 (Ice Cream Sandwich) pasó a formar parte de Android Accessibility Suite — un conjunto de servicios que también incluye Switch Access y Select to Speak. A partir de Android 10, TalkBack viene preinstalado en todos los dispositivos con servicios de Google Play, incluyendo dispositivos de socios — Samsung, Xiaomi, Oppo y otros.
TalkBack admite más de 30 idiomas con varios motores de voz: Google Text-to-Speech, Samsung TTS y de terceros. Para español, Google TTS proporciona una pronunciación natural y entonación correcta. El usuario puede ajustar la velocidad del habla, el tono y seleccionar el género de la voz en la configuración de TalkBack.
TalkBack funciona basándose en el AccessibilityService — un mecanismo del sistema en Android que permite a las aplicaciones recibir información sobre el estado de la interfaz e interactuar con ella mediante programación. Cuando TalkBack está activado, intercepta todos los eventos táctiles y los transforma en gestos especiales de lector de pantalla.
El elemento clave del funcionamiento de TalkBack es el foco de accesibilidad. A diferencia del foco de entrada estándar, que aparece como un resaltado de campo de texto, el foco de accesibilidad se muestra como un marco amarillo alrededor del elemento y es invisible para los usuarios sin TalkBack. Cuando el foco de accesibilidad se posa en un elemento, TalkBack narra su contenido, tipo y estado.
El usuario mueve el foco de accesibilidad mediante gestos: deslizar a la derecha — siguiente elemento, deslizar a la izquierda — elemento anterior. Los elementos se recorren en el orden definido por AccessibilityNodeInfo — el árbol de accesibilidad que Android construye para cada pantalla. El desarrollador puede influir en el orden mediante las propiedades accessibilityTraversalBefore y accessibilityTraversalAfter, lo que es especialmente importante para pantallas complejas con diseños personalizados.
Cada View en la pantalla está representado por un nodo en el árbol de accesibilidad — un objeto AccessibilityNodeInfo. Este objeto contiene: el texto del elemento (contentDescription o texto de la vista), tipo de elemento (botón, casilla de verificación, campo de entrada), estado (activado/desactivado/seleccionado), posición en pantalla y una lista de acciones disponibles. TalkBack recorre este árbol y narra cada nodo en orden de recorrido.
Si una View no tiene contenido de texto (por ejemplo, un ImageView sin descripción), se vuelve invisible para TalkBack — el usuario no sabrá de su existencia. Para solucionarlo, el desarrollador establece contentDescription — una descripción textual que TalkBack pronuncia en lugar del silencio. Android también admite stateDescription para elementos con estado cambiable (marcado/no marcado) y hintText para campos de entrada con sugerencias.
TalkBack transforma los gestos estándar de Android en gestos especiales de lector de pantalla. La mayoría de las operaciones se realizan con uno o dos dedos, mientras que los gestos con tres dedos están reservados para acciones globales.
| Acción | Gesto | Resultado |
|---|---|---|
| Narrar elemento | Toque simple | Pronuncia el nombre y tipo del elemento |
| Activar | Doble toque | Presión de botón o navegación |
| Siguiente | Deslizar a la derecha | Siguiente elemento |
| Anterior | Deslizar a la izquierda | Elemento anterior |
| Desplazar | Deslizar con 2 dedos | Desplazamiento de lista |
| Menú TalkBack | Deslizar arriba-izquierda | Menú global de configuración |
El gesto de deslizar arriba-izquierda (deslizamiento en forma de L) abre el menú global de TalkBack, donde el usuario puede cambiar la velocidad del habla, activar la cortina de pantalla, iniciar un tutorial o abrir la configuración. TalkBack también admite un menú contextual para elementos: deslizar arriba-derecha abre una lista de acciones disponibles para el elemento actual (por ejemplo, “copiar”, “pegar” para un campo de texto o “eliminar” para un mensaje de chat).
Android proporciona una amplia API para configurar la accesibilidad. El nivel básico es contentDescription, pero para un soporte de calidad de TalkBack se requiere trabajar con AccessibilityNodeInfo, AccessibilityDelegate y LiveRegion.
El atributo android:contentDescription establece la descripción textual del elemento para TalkBack. Es obligatorio para ImageView, ImageButton, FloatingActionButton y cualquier View personalizada sin contenido de texto. Para elementos estándar (TextView, Button) contentDescription es opcional — TalkBack leerá el texto automáticamente.
val avatarView = ImageView(this)
avatarView.contentDescription = "Avatar de usuario"
avatarView.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_YES
val playButton = ImageButton(this)
playButton.contentDescription = "Reproducir video"
val progressBar = ProgressBar(this)
progressBar.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_NO
El indicador importantForAccessibility controla la visibilidad del elemento para TalkBack. Un valor de NO oculta el elemento del árbol de accesibilidad — útil para imágenes decorativas, indicadores y fondos personalizados. Un valor de YES incluye forzosamente el elemento en el recorrido incluso si no tiene texto. Es importante no abusar de NO: ocultar elementos semánticamente importantes hace que la aplicación sea inaccesible para los usuarios de TalkBack.
Para Views personalizadas que no utilizan manejadores de clic estándar, es necesario sobrescribir AccessibilityDelegate — una clase que maneja eventos de accesibilidad. El delegado permite establecer descripciones personalizadas, tipos de elementos y listas de acciones disponibles que TalkBack ofrecerá al usuario a través del menú contextual.
class CustomButtonDelegate : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(
host: View, info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = "Botón personalizado"
info.className = Button::class.java.name
info.addAction(
AccessibilityNodeInfoCompat.AccessibilityActionCompat(
R.id.custom_action, "Compartir"
)
)
}
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)
}
}
En el ejemplo, el delegado le indica a TalkBack que el elemento es un botón (className = Button) y proporciona una acción personalizada “Compartir” que aparecerá en el menú contextual de TalkBack. El método performAccessibilityAction maneja la invocación de esta acción. Sin un delegado, TalkBack trataría la View personalizada como un área plana no interactiva, y el usuario no podría interactuar con ella.
El soporte completo de TalkBack incluye no solo contentDescription sino también gestión del foco, LiveRegion para actualizaciones dinámicas, pruebas con el lector de pantalla activado y adaptación para diferentes versiones de Android.
Cuando el contenido de la pantalla cambia sin una acción explícita del usuario (por ejemplo, aparece una notificación de un nuevo mensaje o se actualiza un contador de “me gusta”), TalkBack debe recibir una notificación. Para ello, se utiliza el atributo android:accessibilityLiveRegion para una View en XML o el método setAccessibilityLiveRegion() en código. Un valor de polite agrega el anuncio después de que finalice la narración actual, mientras que assertive lo interrumpe inmediatamente.
val statusText = TextView(this)
statusText.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_POLITE
// Cuando el texto se actualice, TalkBack anunciará
// automáticamente el cambio
statusText.text = "Nuevo mensaje de Ana"
// Para notificaciones críticas — assertive
errorBanner.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE
LiveRegion es el equivalente en Android de UIAccessibility.post en iOS. Use polite para la mayoría de las actualizaciones (nuevos mensajes, actualizaciones de estado) y assertive solo para errores críticos (pago fallido, pérdida de conexión). El uso excesivo de assertive crea una experiencia de usuario negativa — TalkBack interrumpirá constantemente la narración actual.
Para pantallas complejas donde múltiples Views forman una sola unidad lógica, se utiliza AccessibilityNodeProvider o focusSearch para sobrescribir la navegación. Por ejemplo, un calendario personalizado con 42 celdas (6 semanas × 7 días) no debería obligar al usuario a desplazarse por los 42 elementos para llegar al siguiente bloque. El desarrollador puede agrupar las celdas en unidades lógicas: mes → semana → día.
Para Jetpack Compose, el modificador .semantics {} proporciona una API similar: contentDescription, liveRegion, stateDescription, disabled y customActions. Compose también admite mergeDescendants para fusionar semánticas secundarias en una, simplificando la agrupación de elementos sin configuración manual de accessibilityDelegate para cada View.
Button(
onClick = { sendMessage() },
modifier = Modifier.semantics {
contentDescription("Enviar mensaje")
stateDescription("Listo para enviar")
}
) {
Icon(Icons.Filled.Send, "Enviar")
}
Las pruebas de TalkBack se realizan utilizando un dispositivo físico o un emulador con el servicio activado. Se recomienda recorrer los escenarios clave de usuario con la pantalla apagada (Screen Curtain) — esto simula una ausencia total de retroalimentación visual. Android también proporciona Accessibility Scanner — una herramienta para la detección automática de problemas de accesibilidad, que resalta elementos sin contentDescription, áreas de toque demasiado pequeñas y bajo contraste.
Preguntas frecuentes
Configuración → Accesibilidad → TalkBack → Activar. Para una activación rápida, presione ambas teclas de volumen simultáneamente durante 3 segundos. Google Assistant también puede activar TalkBack con el comando de voz “Activa TalkBack”.
TalkBack es un lector de pantalla para Android, VoiceOver es para iOS. TalkBack utiliza AccessibilityService y el foco de accesibilidad con un marco amarillo, mientras que VoiceOver usa UIAccessibility y el rotor. Los gestos y menús difieren: TalkBack tiene deslizamientos en forma de L para el menú global.
Establezca contentDescription para todos los ImageView y elementos personalizados. Use importantForAccessibility para ocultar elementos decorativos. Configure accessibilityLiveRegion para actualizaciones dinámicas y verifique con Accessibility Scanner. En Compose, use el modificador .semantics{}.
Es un objeto que representa un elemento de la interfaz en el árbol de accesibilidad. Contiene texto, tipo, estado, posición y una lista de acciones. TalkBack recorre este árbol para la navegación. El desarrollador puede modificarlo a través de AccessibilityDelegate o atributos en XML.
Verifique importantForAccessibility — podría estar establecido en NO. Asegúrese de que contentDescription esté configurado para elementos sin texto. Para Views personalizadas, implemente AccessibilityDelegate con onInitializeAccessibilityNodeInfo. Use Accessibility Scanner para diagnóstico.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también