studio oreo dispositivos detectar buscar java android accessibility accessibilityservice android-accessibility

java - oreo - buscar dispositivos bluetooth android studio



¿Cómo leer el contenido de la ventana(usando accessibilityService) y evocar la IU usando el dibujo sobre otro permiso de la aplicación en Android? (2)

He realizado con éxito este tipo de aplicación como voodoo. Y obtengo el título de la página del producto Flipkart, el precio, etc. El siguiente método utilizado para hacer que el usuario abra la pantalla del producto.

private boolean isOpenFlipkartProductScreen(AccessibilityNodeInfo nodeInfo){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { if(nodeInfo.getViewIdResourceName()!=null){ if(nodeInfo.getViewIdResourceName().equals("com.flipkart.android:id/callout_last_linearlayout")){ Utils.sPrint("You just open product page : " + nodeInfo.getClass()); isOpenProductPage = true; return true; } } } return false; }

y siguiendo el código a utilizar obtener el nombre del título del producto y el precio.

private String getObtainTitle(AccessibilityNodeInfo sourceInfo){ if(sourceInfo == null) return ""; AccessibilityNodeInfo nodeInfo = sourceInfo.getParent().getParent(); if(nodeInfo!=null){ int i = 0; int i2 = 0; for(int i3=0;i3<nodeInfo.getChildCount();i3++){ try{ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { if(nodeInfo.getChild(i3).getViewIdResourceName().equals("com.flipkart.android:id/title_layout")) { i = 0; // while ( i < nodeInfo.getChild(i).getChildCount()){ AccessibilityNodeInfo child = nodeInfo.getChild(i3).getChild(i); String charSequence = child.getText().toString(); // Utils.sPrint("Title is : " + charSequence); if(charSequence!=null){ return charSequence; } // } } } /* * * Below code to used for getProduct prise in flipkart app product * * */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { if(nodeInfo.getChild(i3).getViewIdResourceName().equals("com.flipkart.android:id/price_layout")){ AccessibilityNodeInfo child = nodeInfo.getChild(i3).getChild(i); String charSequence = child.getText().toString(); if (child.getText().toString().toUpperCase().startsWith("RS.") || child.getText().toString().toUpperCase().startsWith("/u20b9")) { String replace = charSequence.replace("Rs.", "").replace("/u20b9", ""); //return replace // Utils.sPrint("Prise is : " + replace); } } } }catch (Exception ex){ // Utils.sPrint("Ex : " + ex.getMessage()); return ""; } } } return ""; }

Mi last pregunta sobre el mismo tema no fue lo suficientemente clara y la comunidad la dejó en espera y luego se eliminó automáticamente. Por lo tanto, estoy explicando esa pregunta de manera detallada para que la comunidad pueda entender y ayudar de una mejor manera.

Quiero una funcionalidad similar a la aplicación Voodoo y MySmartPrice ofertas de MySmartPrice .

Ahora que hacen

Paso 1: Cuando abrimos la aplicación Voodoo por primera vez, muestran un pequeño tutorial. Al final del tutorial hay un botón "Activar ahora" que cuando se presiona nos lleva a la pantalla de configuración de accesibilidad.

Paso 2: En la Pantalla de accesibilidad, también se explica cómo encontrar y no encontrar el Servicio Voodoo.

Paso 3: Cuando lo habilitamos, también solicita que se le otorguen los permisos "Observe su acción" y "Recuperar contenido de la ventana".

Paso 4: Una vez que hayamos terminado de otorgar los permisos en la pantalla de accesibilidad, y pasar a alguna aplicación de compras o acceder al sitio de compras a través del navegador y acceder a la página del producto, aparecerá un botón flotante vudú automáticamente.

Paso 5: Una vez que hacemos clic en él, muestra el precio de los mismos productos / productos relacionados / similares disponibles en otras aplicaciones o sitios web para que el usuario pueda verificar la mejor oferta disponible.

Captura de pantalla de referencia de vudú

Ahora lo que quiero saber forma la comunidad:

  1. Cómo puedo mostrar mi IU de ayuda en la pantalla Accesibilidad y en la página de detalles del producto.
  2. Cómo detectar cuándo hay una página de producto en la pantalla y evocar mi botón flotante.
  3. Cómo obtener el nombre del producto que se muestra en la pantalla.
  4. ¿Cómo restringir esta funcionalidad de lectura de pantalla solo para algunas aplicaciones? (ya que no quiero terminar en algún tema de derechos de autor)
  5. ¿Hay algún tutorial que pueda ayudarme? Aunque ya había probado en Google para cualquier tutorial directo y no tuve ningún éxito.

Ahora por qué necesito esta información:

Estoy planeando una aplicación para estudiantes que les ayudará a obtener el libro deseado (o similar) (libro electrónico) de forma gratuita si está disponible en mi servidor o en alguna ubicación web disponible en la web. Quiero restringir la funcionalidad a algunas aplicaciones solo debido a problemas de derechos de autor en algunos libros.

Ahora lo que sé por mi estudio sobre este tema (pero no estoy seguro de si estoy en el camino correcto o no)


Intenté resumir cómo pude superar el problema en una publicación de blog. Cualquiera que necesite ayuda puede echarle un vistazo.

Servicio de accesibilidad al siguiente nivel.

Mi respuesta anterior fue eliminada por los moderadores, debido a que acabo de publicar un enlace al blog. Así que estoy publicando mi respuesta de nuevo con detalles aquí también.

La forma más fácil es proporcionada por Android en sí. Si está creando algo en su propia aplicación, esta es la mejor y la más sencilla manera de hacerlo. Debe usar "findAccessibilityNodeInfosByViewId ()" como se explica a continuación

@Override public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo source = event.getSource(); if (source == null) { return; } List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = source.findAccessibilityNodeInfosByViewId("YOUR PACKAGE NAME:id/RESOURCE ID FROM WHERE YOU WANT DATA"); if (findAccessibilityNodeInfosByViewId.size() > 0) { AccessibilityNodeInfo parent = (AccessibilityNodeInfo) findAccessibilityNodeInfosByViewId.get(0); // You can also traverse the list if required data is deep in view hierarchy. String requiredText = parent.getText().toString(); Log.i("Required Text", requiredText); } }

Si está construyendo algo en otras aplicaciones y no conoce el ID de res. Debe crear una lógica con la combinación de padre, número de hijos, nivel en el que se encuentran sus datos y tipo de evento. Debe buscar un patrón en el evento o fuente o la combinación de los valores mencionados anteriormente para obtener los datos requeridos con precisión. Además, debe configurar algunos ajustes en su código para obtener los datos precisos de acuerdo con su tarea. Como en nuestra tarea, tenemos alguna expresión regular para obtener datos valiosos.

Debe tener cuidado de que si se modifica la vista o la interfaz de usuario o se cambian los identificadores de res, su lógica actual podría fallar. Por lo tanto, debe observar de cerca la aplicación en la que está creando su servicio. A continuación se incluye un código de ejemplo en el que obtenemos datos sin ID de resolución que pueden serle útiles para comprender cómo funcionarán.

Para imprimir fuente y evento

@Override public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo source = event.getSource(); if (source == null) { return; } Log.i("Event", event.toString+””); Log.i("Source", source.toString+””); }

Para obtener el niño

source.getChildCount();

Si el recuento de niños es> 0, es posible que tenga que investigarlo.

Código de ejemplo 1

if (level == 0 && source.getClassName().equals("android.widget.TextView") && source.getText()!=null && !source.getText().toString().isEmpty()){ // here level is iteration of for loop String recivedText = source.getText().toString(); if(source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.FrameLayout") && source.getParent().getParent()==null){ return recivedText; } }

Código de ejemplo 2

if (source.getPackageName().equals("PACKAGE NAME OF APP FOR WHICH YOUR EXPECTING EVENT")) { if(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && "COMPLETE NAME OF ACTIVITY CLASS WITH PACKAGE NAME (if you want it for some specific screen)".equals(event.getClassName())){ if(source.getText()!=null && source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.RelativeLayout")&& source.getParent().getParent()!=null && source.getParent().getParent().getClassName().equals("android.widget.ScrollView") && source.getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getClassName().equals("android.support.v4.view.ViewPager")&& source.getParent().getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getParent().getClassName().equals("android.widget.FrameLayout")&& source.getParent().getParent().getParent().getParent().getParent()==null){ return source.getText().toString(); } }

Es un poco torpe, pero para que funcione debe buscar en los registros para encontrar un patrón que lo lleve a los datos requeridos.

Actualización 20/11/2017 Google está suspendiendo todas las aplicaciones que usan servicios de accesibilidad para otras cosas que no sea la accesibilidad. Recibí un correo electrónico con respecto a lo mismo para uno de mi aplicación y otros desarrolladores también están recibiendo el mismo correo electrónico de google ( Reddit ). Entonces, creo que deberíamos buscar otra forma de hacer las cosas y les pido que actualicen la actualización aquí también, si a alguien se le ocurre otra implementación para lograr el mismo comportamiento, también ayudaría a otros.

Gracias Umesh Chauhan