Come leggere il contenuto della window (utilizzando accessibilityService) e evocare l'interface utente utilizzando il disegno su un'altra authorization di applicazioni in Android?

La mia ultima domanda sullo stesso argomento non era abbastanza chiara e fu messo in attesa dalla comunità e successivamente è stata eliminata automaticamente. Quindi, sto spiegando questa domanda in maniera dettagliata in modo che la comunità possa capire e aiutare in modo migliore.

Voglio una funzionalità simile a Voodoo App e MySmartPrice .

  • java.lang.NoClassDefFoundError: javax.microedition.io.Connector
  • Imansible importre le classi di android.hardware.camera2
  • Android: cambia l'applicazione predefinita Home
  • spostando gli elementi in listview, con un piccolo margine verticale
  • SQLite e Android. Come faccio a utilizzare String Avendo nella mia query?
  • Come fare una visualizzazione web a schermo integer
  • Ora che fanno

    Fase 1: quando apriamo la Voodoo App per la prima volta mostrano un piccolo tutorial. Alla fine del tutorial c'è un button "Attiva ora" che, quando viene premuto, ci port alla schermata delle impostazioni di Accessibilità.

    Fase 2: Nella schermata di accessibilità esegue ulteriormente la guida per trovare e non accedere al servizio Voodoo.

    Fase 3: quando lo abilitiamo, chiedere ulteriormente di concedere le autorizzazioni "Osserva la tua azione" e "Recupera il contenuto della window".

    Fase 4: una volta che abbiamo ottenuto la concessione di autorizzazioni alla schermata dell'accessibilità e spostati in un'applicazione di acquisto o accediamo al sito di acquisto tramite browser e raggiungiamo la pagina del prodotto, un button floating voodoo si apre automaticamente.

    Fase 5: una volta che facciamo clic su di esso, viene mostrato il prezzo dei prodotti stessi / correlati / simili disponibili su altre applicazioni o sito web in modo che l'utente possa controllare la migliore offerta disponibile.

    Screenshot di riferimento di Voodoo

    Voodoo Screen 1

    Schermata di accessibilità

    Schermata di accessibilità 2

    Schermata di concessione delle autorizzazioni

    Voodoo Screen 2

    Voodoo Floating Button sulla pagina del prodotto

    Voodoo risultati con l'aiuto di disegnare su altri app

    Ora quello che voglio sapere forma la comunità:

    1. Come posso mostrare la mia interface utente sulla schermata di accessibilità e la pagina dei dettagli del prodotto.
    2. Come rilevare quando una pagina di prodotto è presente sullo schermo e evoca il mio button galleggiante.
    3. Come recuperare il nome del prodotto visualizzato sullo schermo.
    4. Come limitare questa funzionalità di lettura dello schermo per alcune applicazioni? (perché non voglio finire in qualche problema di copyright)
    5. C'è qualche tutorial che può aiutarmi? Anche se avevo già provato su Google per qualsiasi tutorial diretto e non ho avuto alcun successo.

    Ora perché ho bisogno di queste informazioni:

    Sto progettando un'applicazione per gli studenti che li aiuterà a ottenerli libere (o simile) (ebook) gratuitamente se è disponibile sul mio server o su un sito Web disponibile in networking. Voglio limitarla alla funzionalità di alcune applicazioni solo a causa di problemi di copyright su alcuni libri.

    Ora quello che so dal mio studio in merito a questo argomento (ma non sono sicuro se sono sulla buona strada o no)

    • Posso prendere il servizio di Accessibility Service
    • Disegnare su altre applicazioni. Esempio 1 , Esempio 2

  • App Android: come leggere la dimensione del carattere in Impostazioni?
  • Quando si utilizza TalkBack, quale è il modo preferito per avvisare l'utente quando il contenuto di un TextView è stato modificato?
  • AccessibilityService è stato avviato ma non riceve AccessibilityEvents su JellyBean
  • Come posso mantenere un gesto di un puntatore quando è triggersto l'esplorazione per contatto?
  • dispatchPopulateAccessibilityEvent non viene triggersto
  • Impostare il text in AccessibilityNodeInfo
  • 2 Solutions collect form web for “Come leggere il contenuto della window (utilizzando accessibilityService) e evocare l'interface utente utilizzando il disegno su un'altra authorization di applicazioni in Android?”

    Ho cercato di riassumere come ho potuto get attraverso il problema in un post sul blog. Chiunque abbia bisogno di qualche aiuto può esaminarlo.

    Servizio di accessibilità al livello successivo

    La mia risposta precedente è stata eliminata da moderatori che potrebbero avere a disposizione un link al blog. Quindi sto postando la mia risposta con i dettagli anche qui.

    Il modo più semplice è fornito da Android stesso. Se stai costruendo qualcosa sul tuo app, questo è il modo migliore e più semplice di farlo. Devi usare "findAccessibilityNodeInfosByViewId ()" come spiegato di seguito

    @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); } } 

    Se stai costruendo qualcosa su altre applicazioni e non conosco il res id. Devi build una logica con la combinazione di genitore, numero di figlio, livello su cui vengono trovati i dati, tipo di evento. Devi cercare un model nell'evento o nella sorgente o la combinazione di tali valori per get i dati necessari precisi. Inoltre, devi impostare un po 'di tweak nel tuo codice per get i dati accurati in base al tuo task. Come nel nostro task abbiamo alcune regex per get dati preziosi.

    Devi fare attenzione che se la vista o l'interface utente viene modificata o vengono modificati i res id, la tua logica corrente potrebbe fallire. Dunque, devi guardare attentamente l'app su cui stai costruendo il tuo servizio. Di seguito sono riportti alcuni esempi di codice in cui riceviamo dati senza res id che potrebbe essere utile per capire come funziona.

    Per printingre sorgente e 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+””); } 

    Per get il figlio figlio

     source.getChildCount(); 

    Se il numero dei bambini è> 0, dovresti esaminarlo.

    Esempio di codice 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; } } 

    Esempio di codice 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(); } } 

    È un po 'goffo, ma per farlo funzionare devi guardare profondamente nei registri per trovare un model che ti porterà ai tuoi dati richiesti.

    ho eseguito con successo questo tipo di applicazione come voodoo.and ottieni il titolo della pagina del prodotto di flipkart, il premio ecc. succssfully. il seguente metodo utilizzato per get lo schermo utente aperto del prodotto.

     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; } 

    e seguendo il codice utilizzato per get il nome del prodotto e il premio.

     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 ""; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.