¿Cómo saber si Android TalkBack está activo?
Estoy desarrollando una aplicación que utiliza TalkBack para guiar a la gente a través de ella. Sin embargo, en esas situaciones quiero tener algunas diferencias sutiles en el diseño de la aplicación para la navegación es más fácil y también tienen salidas de voz adicionales (con TextToSpeech) para ayudar a guiar al usuario.
Mi problema es que solo quiero esos cambios y salidas adicionales si el usuario tiene activo TalkBack.
- Eliminar el foco de ActionBar android Accessibility
- Activar / desactivar mediante programación la configuración de accesibilidad en un dispositivo Android
- Android internos y limitaciones de memoria / procesador?
- Accesibilidad de Android com.android.settings: id / left_button sobre la fuerza no funciona
- AccessibilityNodeInfo - enviar texto
¿Hay alguna manera de saber si lo es? No encontré nada específico para acceder a la configuración de TalkBack directamente, pero esperaba que hubiera algún tipo de acceso a la configuración general del teléfono que pudiera hacerme saber lo que necesito.
Saludos y gracias de antemano.
- El teclado de detección está activo fuera de la aplicación en android
- ¿Cómo 'interrumpir' una acción de ser realizada en AccessibilityService?
- Establecer contentDescription para un diálogo personalizado
- Enfoque en movimiento dentro de un FrameLayout
- La casilla de verificación centrada en estilos no se puede comprobar cuando se utiliza TalkBack o VoiceOver
- ¿Qué debo poner en el atributo contentDescription para las imágenes decorativas como el separador de campo?
- ¿Cómo codificar Android para los discapacitados visuales?
- Imagebutton me da error: Falta el atributo contentDescription en la imagen
Para un ejemplo, busque isScreenReaderActive()
en el archivo HomeLauncher.java en la aplicación de shell sin ojos (vía el subproceso de grupos ).
Para resumir: se detectan todos los lectores de pantalla con Intents, luego consulta al proveedor de estado de cada uno para ver si está activo.
Si realmente desea limitarlo a TalkBack solamente, podría intentar comprobar el ResolveInfo.serviceInfo.packageName
para cada resultado devuelto de queryIntentServices()
para ver si coincide con el paquete de TalkBack.
La forma recomendada de hacerlo es consultar el AccessibilityManager
para el estado habilitado de los servicios de accesibilidad.
AccessibilityManager am = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE); boolean isAccessibilityEnabled = am.isEnabled(); boolean isExploreByTouchEnabled = am.isTouchExplorationEnabled();
Novoda ha lanzado una biblioteca llamada accessibilitools que hace este cheque. Se consulta al administrador de accesibilidad para comprobar si hay servicios de accesibilidad habilitados que admitan el indicador de "retroalimentación hablada".
AccessibilityServices services = AccessibilityServices.newInstance(context); services.isSpokenFeedbackEnabled();
Para mí, he resuelto este problema de esta manera, funciona bien en mi proyecto:
- Use getEnabledAccessibilityServiceList () para obtener todo el servicio de accesibilidad, un servicio cuyo estado está abierto estará en esta lista
- Talkback contiene una actividad llamada com.android.talkback.TalkBackPreferencesActivity, puede recorrer la lista para encontrar si el servicio de talkback está abierto
El código detallado a continuación:
private static final String TALKBACK_SETTING_ACTIVITY_NAME = "com.android.talkback.TalkBackPreferencesActivity"; public static boolean accessibilityEnable(Context context) { boolean enable = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { try { AccessibilityManager manager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE); List<AccessibilityServiceInfo> serviceList = manager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN); for (AccessibilityServiceInfo serviceInfo : serviceList) { String name = serviceInfo.getSettingsActivityName(); if (!TextUtils.isEmpty(name) && name.equals(TALKBACK_SETTING_ACTIVITY_NAME)) { enable = true; } } } catch (Exception e) { if (Logging.isDebugLogging()) { e.printStackTrace(); } } } return enable; }