¿Cómo escuchar los grifos y obtener vistas con Accessibility en Android?

Quiero implementar un servicio de accesibilidad en mi aplicación de Android, que puede hacer lo siguiente:

=> Obtenga los clics / clics en pantalla en todas las aplicaciones.

=> Obtener la vista que fue pulsada / pulsada.

Inicialmente pensé que no sería posible hacerlo por razones de seguridad, pero al hacer algunas investigaciones me encontré con una aplicación ( Portapapeles Nativo ) que podría hacer las siguientes cosas:

=> Detectar taps en EditText s desde cualquier aplicación

=> Añadir valor (cadena) a aquellos EditText .

También vi el talkback de Google que habla lo que usted golpea ligeramente. Para que hable, necesita acceder a la vista (para obtener el texto) en todas las aplicaciones.

Estas aplicaciones obviamente hace uso de "servicios de accesibilidad" para hacerlo, pero me gustaría saber cómo puedo implementar eso?

En su mayoría, encontrar tutoriales o cosas para las cosas que tengo que lograr, pero estoy luchando encontrar algunos para la implementación de servicio de accesibilidad para mi aplicación. Hice visitar la documentación oficial de Android que es demasiado técnico para un novato como yo. (Inicialmente prefiero aprender de Youtube, SO y tutorial sitios web). También será genial si me puede señalar a algunos otros tutoriales que cubre estas cosas.

Los servicios de accesibilidad están bastante mal documentados, pero he creado un código de servicio de accesibilidad, que establece un proyecto inicial y registra las devoluciones de llamada base. Voy a añadir el enlace más tarde, pero aquí hay un poco de código que creo que le importa sobre sus preguntas específicas. El andamio, proyecto montado y tal lo dejo para el repo.

A continuación se muestra la devolución de llamada onAccessibilityEvent. Aquí es donde escuchará los diferentes tipos de eventos y el lugar más conveniente para captar el contenido de la pantalla para la mayoría de los escenarios. Sin embargo, como un servicio de accesibilidad que también no tiene que esperar a los eventos. Podrías lanzar fácilmente una AsynTask y agarrarla en un intervalo de algún tipo.

 public void onAccessibilityEvent(AccessibilityEvent event) { CLog.d(event.toString()); switch (event.getEventType()) { //On Gesture events print out the entire view heirarchy! case AccessibilityEvent.TYPE_GESTURE_DETECTION_START: CLog.d(A11yNodeInfo.wrap(getRootInActiveWindow()).toViewHeirarchy()); case AccessibilityEvent.TYPE_VIEW_CLICKED: CLog.d(event.getSource().toString()); default: { //The event has different types, for you, you want to look for "action clicked" if (event.getSource() != null) { CLog.d(A11yNodeInfo.wrap(event.getSource()).toViewHeirarchy()); } } } } 

Voy a señalar un poco de configuración para esto, porque es muy importante. Los servicios de accesibilidad se configuran mejor a través de un archivo XML conectado a su servicio a través del archivo Manifest. El contenido de este archivo es:

 <?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/accessibility_service_description" android:accessibilityEventTypes="typeAllMask" android:accessibilityFlags="flagReportViewIds" android:canRetrieveWindowContent="true" android:canRequestTouchExplorationMode="true" android:accessibilityFeedbackType="feedbackSpoken" android:notificationTimeout="100" android:settingsActivity="com.moba11y.basicaccessibilityservice.SettingsActivity" /> 

Para usted, los bits importantes son canRetrieveWindowContent="true" y "accessibilityEventTypes =" typeAllMask "". Un bit de diseño que me gusta, es asegurar que su agarrar en el conjunto mínimo de tipos de eventos que desea. Diferentes eventos de accesibilidad reportan resultados ampliamente diferentes. Por ejemplo, muchos eventos devuelven "null" de getSource (). Esto le obliga a agregar una gran cantidad de filtros para esto, o el riesgo de las excepciones puntero nulo. Es bastante molesto.

Lo último que necesitas es Acciones de Accesibilidad. Esto es lo que le permite simular clics, clics largos Y agregar texto a una vista de texto editable. A continuación se muestra el código que le permite hacer esto.

 public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo source = event.getSource(); if (source != null & event.getClassName().equals("android.widget.EditText")) { Bundle arguments = new Bundle(); arguments.putCharSequence(AccessibilityNodeInfo .ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "some value"); source.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments); } } 

https://github.com/chriscm2006/Android-Accessibility-Service-Boilerplate

  • "403 - useLimits" en la API de youtube
  • Hook Android Sytem API relacionados con la salida de texto
  • Excepción de puntero nulo de Android en la respuesta de Retrofit
  • Adición de Google maps api v2 a un proyecto existente
  • Esquema de URL personalizado de Instagram para Android
  • ¿Cómo usar la API del telegrama para crear una aplicación de chat?
  • Samsung que cuelga API con el dedo
  • ¿Es posible soportar una función setScrollY () (ScrollView API 14) como función para los antiguos niveles de API?
  • Retrofit 2.0 lanzando "IllegalArgumentException: los parámetros @Field solo se pueden usar con la codificación de formularios". ¿Cómo hacer la consulta correcta de la API y arreglarlo?
  • 500 Error interno del servidor para GET en www.googleapis.com/androidpublisher/v1/
  • Escribir una API de PHP y una aplicación para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.