Introducción: La Relevancia de la Accesibilidad Móvil
La accesibilidad en el diseño de experiencias de usuario (UX) e interfaces de usuario (UI) se refiere a la creación de productos digitales que puedan ser utilizados por todas las personas, independientemente de sus capacidades técnicas, físicas o cognitivas. Implementar estos principios no solo cumple con las leyes y estándares internacionales, sino que también mejora la experiencia de usuario para una audiencia más amplia. La accesibilidad de una aplicación es su capacidad para que todas las personas puedan utilizar sus funciones y acceder a su contenido, independientemente de sus capacidades. Conseguir que una aplicación móvil funcione de forma más sencilla es muy importante para que un mayor número de usuarios puedan utilizarla y no terminen por abandonarla al encontrarse problemas de acceso a sus funciones.

Impacto de la Discapacidad en el Uso de Dispositivos Móviles
Los servicios de accesibilidad ayudan a los usuarios con discapacidades a usar dispositivos y aplicaciones para Android. El daltonismo, por ejemplo, afecta a 1 de cada 12 hombres (8%) y a 1 de cada 200 mujeres, lo que representa aproximadamente el 4,5% de la población mundial. En España, alrededor de 1 millón de personas tienen problemas de audición, desde sordera profunda hasta diversos grados de pérdida auditiva, según la Confederación Estatal de Personas Sordas (CNSE). Además, casi un millón de personas en España tienen algún tipo de discapacidad visual.
La accesibilidad en dispositivos móviles no solo es crucial para estas personas con discapacidades permanentes, sino también para aquellos que enfrentan discapacidades temporales o situacionales. Por ejemplo, alguien con un brazo escayolado (discapacidad temporal) o una persona que sostiene a un bebé (discapacidad situacional) y necesita usar su dispositivo con una sola mano, se benefician enormemente de estas funcionalidades.
Servicios de Accesibilidad en Android: Funcionamiento y Capacidades
Los servicios de accesibilidad son una función del framework de Android diseñada para proporcionar comentarios de navegación alternativos al usuario en nombre de las aplicaciones instaladas en dispositivos Android. Un servicio de accesibilidad puede comunicarse con el usuario en nombre de la aplicación, por ejemplo, convirtiendo texto en voz o proporcionando comentarios hápticos cuando un usuario se desplaza sobre un área importante de la pantalla. En el desarrollo de una aplicación, es fundamental incluir elementos que interactúen con los servicios de accesibilidad del sistema operativo para hacer que la aplicación sea accesible para los usuarios.

Permisos y Estructura
Un servicio de accesibilidad solicita permiso para observar las acciones del usuario, recuperar el contenido de la ventana y realizar gestos en nombre del usuario. El permiso clave es WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY. La mayor parte del código de un servicio de accesibilidad se encuentra generalmente en un archivo como GlobalActionBarService.java. Una vez que el sistema se vincula a un servicio, llama al método onServiceConnected(), momento en el que el servicio de accesibilidad tiene todos los permisos necesarios para funcionar.
Ejemplos de Funcionalidades de un Servicio de Accesibilidad
Mientras que Google proporciona servicios como Accesibilidad con interruptores, Acceso por voz y TalkBack para los usuarios de Android, estos servicios no pueden satisfacer las necesidades de todos los usuarios con discapacidades. Un servicio personalizado puede superponer una barra de acciones global en la pantalla, ofreciendo diversas interacciones:
- Acceso al menú del botón de encendido: El método configurePowerButton() utiliza performGlobalAction(), que proporciona AccessibilityService, para acceder al menú del botón de encendido. Las acciones globales no están vinculadas a ninguna vista específica.
- Control de volumen: El método configureVolumeButton() agrega un onClickListener() que se activa cuando el usuario presiona el botón de volumen, permitiendo personalizar su comportamiento.
- Desplazamiento por la interfaz: Un servicio de accesibilidad no tiene acceso a las vistas reales en la pantalla. En cambio, ve un reflejo de lo que se muestra en la pantalla en forma de un árbol compuesto por objetos AccessibilityNodeInfo. Estos objetos contienen información sobre la vista que representan (ubicación, texto, metadatos, acciones compatibles). El método findScrollableNode() realiza un recorrido en amplitud de este árbol, comenzando en el nodo raíz, para identificar elementos desplazables. Este método crea un onClickListener() que se activa al hacer clic en un botón de desplazamiento, realizando una acción de desplazamiento.
- Realización de gestos complejos: El método configureSwipeButton() utiliza una API que permite realizar gestos en nombre del usuario, útil para funciones como deslizar en la aplicación de mapas.
Cuando la interfaz de usuario cambia, los servicios de accesibilidad reciben notificaciones sobre esos cambios a través de objetos AccessibilityEvent, permitiendo al servicio reaccionar dinámicamente.
Principios de Diseño y UX para Aplicaciones Accesibles
Desde un punto de vista técnico, la creación de aplicaciones accesibles debe ser una prioridad desde el inicio del desarrollo, incluyendo la definición de funcionalidades y el diseño de la aplicación. Para conseguir esto, es fundamental considerar la accesibilidad tanto en el diseño como en el desarrollo.
Directrices de Diseño de Interfaz de Usuario (UI)
- Tipografías: Uso de tipografías simples y sin adornos para mejorar la legibilidad.
- Uso del color: Acompañar las acciones con otros recursos gráficos además del color es crucial para asegurar la accesibilidad. Evitar depender solo del color para transmitir significado, por ejemplo, usando patrones o iconos adicionales.
- Títulos en campos de texto: Mostrar siempre el título en los campos de texto ayuda a los usuarios a comprender rápidamente qué información se requiere, especialmente aquellos con discapacidades cognitivas o problemas de memoria.
- Placeholders: Utilizar placeholders en los campos de texto es útil para proporcionar ejemplos de formato o información esperada, ayudando a los usuarios a entender claramente qué tipo de datos deben ingresar.
- Textos de ayuda: Ofrecer textos de ayuda proporciona explicaciones adicionales y aclaraciones sobre cómo utilizar una función o qué tipo de información se necesita.
- Botones grandes: Los botones grandes son más fáciles de tocar y minimizan errores, especialmente para personas con discapacidades motoras o problemas de coordinación.
- Consistencia: Los elementos de navegación, botones y campos de texto deben ubicarse de manera consistente en cada pantalla.
- Gestos: Gestos complejos, como múltiples toques, pellizcos o deslizamientos en varias direcciones, pueden ser difíciles de ejecutar para muchos usuarios. Es preferible ofrecer alternativas.
Aspectos Técnicos para Desarrolladores
Los frameworks de accesibilidad tanto de iOS como de Android permiten que las personas con algún tipo de discapacidad puedan utilizar las aplicaciones sin excesiva dificultad. Es importante tener en cuenta que, aunque estos frameworks tienen muchas opciones, algunos diseños no están pensados con ese fin. Compose ofrece muchos comportamientos de accesibilidad de forma predeterminada, y Jetpack Compose utiliza elementos componibles integrados como Button, Switch y Checkbox para crear IU accesibles.
Orden de Foco y Navegación
Los usuarios que utilizan la accesibilidad en aplicaciones están acostumbrados a que el foco empiece en la parte superior izquierda de la pantalla y se mueva de izquierda a derecha. Es posible que en ciertas ocasiones se desee que el orden del foco cambie excepcionalmente por necesidades de usabilidad. Esto se puede lograr modificando la propiedad accessibilityElements en iOS (disponible en cualquier elemento que implemente UIView) o aplicando el modificador accessibilitySortPriority(_:) a cualquier View en SwiftUI. En Android, se puede usar el atributo android:screenReaderFocusable del objeto contenedor a true y android:focusable de cada objeto interno en false. En Compose, se utiliza el parámetro mergeDescendants en el modifier semantics o el modificador .accessibilityElement(children: .combine).
Aunque los usuarios suelen mantenerse en un mismo sistema operativo, es importante que el movimiento del foco sea consistente en ambas plataformas.
Etiquetado y Descripciones de Contenido
Es importante brindar a los usuarios etiquetas útiles y descriptivas para cada elemento interactivo de la IU de la aplicación. En cada etiqueta, se debe explicar la semántica de un elemento específico, es decir, su significado y propósito. Para elementos Image o Icon puramente decorativos, se debe establecer contentDescription = null o usar hideFromAccessibility. En Compose, si necesitas especificar manualmente las propiedades semánticas, usa el modificador semantics y la propiedad contentDescription.
Cuando etiquetas elementos editables, como campos de texto, resulta útil mostrar texto que brinde un ejemplo de entrada válida, además de hacerlo disponible para los lectores de pantalla. Cuando varios elementos de la IU forman un grupo natural, es recomendable organizarlos dentro de un contenedor principal (como Column, Row o Box) y hacer que solo el contenedor principal sea interactivo, evitando agregar modificadores clickable o focusable a los elementos secundarios.

Notificaciones y Eventos de Accesibilidad
Para alertas y mensajes de error importantes, se debe cambiar el foco de la herramienta de accesibilidad para notificar a los usuarios con discapacidad de inmediato. Esto es posible en iOS mandando una notificación de UIAccessibility, generalmente .screenChanged para nuevas vistas o .layoutChanged para cambios importantes de layout.
Elementos Personalizados y Semántica
En el desarrollo de aplicaciones, a menudo se necesitan crear componentes personalizados que simulan ser un botón u otro tipo de elemento. Existen numerosas clasificaciones a través de los UIAccessibilityTraits en iOS que especifican el tipo de elemento al que se está haciendo foco. En Android, se hace uso de roleDescription. Es posible activar la accesibilidad en una vista contenedora estableciendo isAccessibilityElement = true en iOS o usando el atributo android:screenReaderFocusable en Android.
Cuando se compila un componente personalizado, hay que asegurarse de proporcionar todas las propiedades semánticas pertinentes, como el rol (Role.Switch, Role.Button), stateDescription ("Activado", "Desactivado"), y cualquier etiqueta de acción.
Ocultar Elementos Irrelevantes
Para no saturar a los usuarios con discapacidad con información irrelevante, es recomendable ocultar los elementos decorativos o no funcionales a los frameworks de accesibilidad. En Compose, se puede usar hideFromAccessibility o clearAndSetSemantics para borrar por completo la semántica predeterminada de un elemento y sus elementos secundarios, creando un nuevo elemento de accesibilidad unificado.
Principios de Interacción Generales
Los programas accesibles ayudan a todos los usuarios de alguna manera porque los objetivos de accesibilidad y facilidad de uso se superponen. El diseño accesible es, al menos en parte, sobre la concesión de opciones a los usuarios.
- Contraste de color: Los altos contrastes entre componentes de la aplicación suelen ayudar a los usuarios con discapacidades visuales. Los programas deben ofrecer buenas opciones de contraste de color.
- Tamaño del texto: Asegurarse de que los usuarios tienen una manera de ajustar el tamaño del texto en la interfaz de usuario del programa.
- Accesibilidad con el teclado: Cada elemento de interfaz de usuario con el que el usuario puede interactuar debe ser accesible con el teclado. Las teclas Tab, de dirección, la barra espaciadora y la tecla Enter son importantes. Las claves de acceso permiten a los usuarios elegir opciones y activar comandos sin tener que navegar primero al control. Asigne claves de acceso a todos los elementos de menú y a todos los controles interactivos.
- Entrada alternativa: Los teclados en pantalla son una necesidad para usuarios con dificultades con teclados físicos.
- Soporte de Audio: No confiar solo en el sonido para transmitir significado. Permitir que los usuarios controlen el volumen de la salida de audio y dirigir el sonido del programa a un rango ajustable entre 500 Hz y 3000 Hz.
- Tutoriales y animaciones: Mostrar conceptos difíciles en la ayuda mediante tutoriales y limitar el uso de animaciones, ya que algunos usuarios son sensibles al movimiento de pantalla.
- Texto alternativo: Limitar el texto alternativo a 150 caracteres como máximo. No usar texto para dibujar líneas o símbolos gráficos, ya que pueden confundir a los lectores de pantalla.
Herramientas para Evaluar la Accesibilidad: Prueba de Accesibilidad de Android
La Prueba de accesibilidad es una herramienta que analiza la interfaz de usuario de una aplicación para dar recomendaciones y mejorar su accesibilidad. Permite identificar con rapidez y facilidad una gran variedad de mejoras comunes, como aumentar el tamaño de los objetivos táctiles pequeños, incrementar el contraste del texto y las imágenes, y proporcionar descripciones de contenido de los elementos gráficos sin etiquetar. Mejorar la accesibilidad de las aplicaciones puede aumentar la satisfacción y retención de los usuarios, y mejorar las calificaciones de la aplicación.
Para usar la Prueba de accesibilidad:
- Abrir la aplicación y activar el servicio de Prueba de accesibilidad.
- Navegar a la aplicación que se quiere analizar y presionar el botón flotante de Prueba de accesibilidad.
- Elegir entre un análisis puntual o registrar todo el recorrido de un usuario.
Las mejoras sugeridas pueden compartirse fácilmente con el equipo de desarrollo para su implementación.

Funciones de Accesibilidad Integradas en Android
Los dispositivos móviles modernos cada vez incluyen más opciones de accesibilidad para facilitar que cualquier usuario pueda utilizarlos. Para interactuar con tu dispositivo mediante mensajes de voz y opciones táctiles, puedes activar el lector de pantalla TalkBack, que incluso incluye un teclado braille de 6 puntos en pantalla. Para recibir mensajes de voz en determinados momentos, está la opción Enunciar selección. Voice Access permite controlar el dispositivo con la voz, y Accesibilidad con interruptores permite interactuar con el dispositivo a través de uno o varios interruptores. La Lupa ayuda a leer texto pequeño o ver objetos de cerca o lejanos. El Amplificador de sonido permite usar auriculares con cable o inalámbricos con Bluetooth para mejorar el audio. El interruptor "Audiodescripción" de Android TV y teléfonos Android (Android 13 y versiones posteriores) reproduce audiodescripciones de los elementos visuales en pantalla de los vídeos.
La Suite de Accesibilidad Android incluye el menú Accesibilidad, Enunciar selección, Accesibilidad con interruptores y TalkBack. Explorar los ajustes de un dispositivo Android permite personalizarlo de diversas formas.
Política de Google Play sobre los Servicios de Accesibilidad
Uno de los cambios más importantes en los últimos años en Android es la limitación de permisos. Los servicios de accesibilidad, si bien fueron creados inicialmente para personas con deficiencias visuales, auditivas y motoras, no son un permiso como tal sino una serie de funciones que Android tiene disponible para que las aplicaciones puedan crear gestos y acciones en nombre del usuario. Desde reconfigurar los botones de volumen, modificar los botones de navegación o incluso automatizar toques en la pantalla, estos servicios permiten que las aplicaciones sean muy potentes.

Restricciones y Seguridad
Google ha comenzado a limitar el uso de estos servicios por parte de aplicaciones que no están directamente relacionadas con tareas de accesibilidad. La razón principal es la seguridad y la privacidad: tener permiso para los servicios de accesibilidad permite que muchos malware puedan comprometer seriamente la seguridad de Android, implementando técnicas de phishing o incluso keyloggers. Google busca asociar su sistema operativo con los términos privacidad y seguridad, lo que se consigue con una combinación de mano dura en la Play Store y revisión profunda de la estructura de permisos de las aplicaciones.
Impacto en Desarrolladores y Aplicaciones
Recientemente, Google Play ha enviado un correo a los desarrolladores cuyas aplicaciones implementan el permiso android.permission.BIND_ACCESSIBILITY_SERVICE. La acción requerida es explicar a los usuarios cómo la aplicación utiliza este permiso para ayudar a personas con discapacidad. Las aplicaciones que no cumplan este requisito en un plazo de 30 días pueden ser eliminadas de Google Play. Esto ha afectado a muchas aplicaciones conocidas que aprovechaban estos servicios para automatización de gestos (AutoInput, Button Mapper, Inputting+), autocompletado (LastPass), hibernación (Greenify) o atajos (Nova Launcher con Sesame Shortcuts).
Aunque algunas de estas aplicaciones son muy útiles, la nueva política busca evitar que aplicaciones maliciosas exploten estas potentes funcionalidades. Google determinará si existe un motivo válido para el uso de estos servicios. Para algunas aplicaciones, esto significará buscar nuevas maneras de ofrecer funcionalidades similares sin usar la API de accesibilidad, lo cual puede ser complicado, o incluso requerir permisos root. Para otras, como LastPass, nuevas APIs como Autofill en Android Oreo ofrecen alternativas más seguras.