2017-07-04 7 views
8

Ich war neugierig, ich habe diese App neulich gesehen, die es erlaubt, andere Anwendungen zu öffnen und bestimmte Funktionen für Sie automatisch einzustellen. Ich habe erkannt, dass es eine Bildschirm-Klick-Funktion irgendeiner Art verwenden muss, aber ich kann keine Dokumentation für so etwas finden. Zum Beispiel, wenn wir wissen, dass die auf dem Bildschirm Text aus dem anderen App „Ready“ ist, gibt es eine Möglichkeit, dass Text und vielleicht etwas tun, wie zu lesen:Android Clickable Auf dem Bildschirm Text

protected void processText(String text) 
{ 
    if (text.contains("Ready")) 
     // click the ready text 
} 
+0

Möchten Sie auf Text klicken oder einen Teil eines Textes klickbar machen oder Bildschirmklickkoordinaten erhalten? Informationen über die ehemalige könnte hier erhalten werden: https://www.google.com.ng/url?url=https://stackoverflow.com/questions/10696986/how-to-set-the-part-of-the -text-view-is-clickable & rct = j & sa = U & ved = 0ahUKEwilotjX6-7UAhXIYlAKHfF8BwgQFggbMAA & q = android + make + teil + von + text + klickbar & usg = AFQjCNEVpYcyHrHbO5NKt5jBPVqAjpNiFg –

+0

@ Mofe-hendyEjegi Ich möchte auf den Text klicken, ohne dass der Benutzer es selbst tun muss. Aber da es auf einer anderen App ist, kann ich es nicht klicken, das ist, was ich versuche herauszufinden, wie es geht. – Jayce

+0

Check in Accessibility api, dass alles, was ich für weitere Informationen helfen kann, lesen https://stackoverflow.com/questions/35842762/how-to-read-window-content-using-accessibilityservice-and-evoking-ui-using-dra – ingsaurabh

Antwort

3

Ich habe dies mit AccessibilityService getan. Es wird jedoch nur auf API-Ebene> = 16 funktionieren.

Sie müssen AccessibilityService erweitern. Zum Beispiel erhält diese Klasse einen Text von USSD-Antworten und verwirft den Dialog.

// .... 
public class UssdAccessibilityService extends AccessibilityService { 
    public UssdAccessibilityService() { 
    } 

    @TargetApi(16) 
    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     if (!"com.android.phone".equalsIgnoreCase((String)event.getPackageName())){ 
      // In this example we are only interested in events comming 
      // from "com.android.phone" package 
      event.recycle(); 
      return; 
     } 

     String className = (String)event.getClassName(); 
     if (className == null || (!className.contains("AlertDialog") && !className.contains("AlertDialog"))){ 
      // Class is not an USSD dialog 
      event.recycle(); 
      return; 
     } 

     AccessibilityNodeInfo source = event.getSource(); 
     if (source == null) { 
      // getSource() is annotated @Nullable, so we do this to be 
      // safe just in case 
      event.recycle(); 
      return; 
     } 

     AccessibilityNodeInfo acceptButton = null; 
     String ussdText = null; 

     int childCount = source.getChildCount(); 
     for (int i = 0; i < childCount; i++){ 
      AccessibilityNodeInfo current = source.getChild(i); 
      if (current == null) 
       continue; 

      String currentText = (String)current.getText(); 
      if (current.isClickable()){ 
       // In the case of USSD dialogs, there is only one clickable. 
       // May be necessary to do more robust search in other scenarios 
       acceptButton = current; 
       continue; 
      } 

      ussdText = currentText; 

      current.recycle(); 
     } 

     if (ussdText!= null) { 
      if (acceptButton != null) 
       acceptButton.performAction(AccessibilityNodeInfo.ACTION_CLICK); 

     } 

     source.recycle(); 
     event.recycle(); 
    } 

    // .... 
} 

Sie müssen die Zugänglichkeit Service im Manifest erklären unter <application>

<service 
     android:name=".UssdAccessibilityService" 
     android:enabled="true" 
     android:label="Read USSD codes and dismiss" 
     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.accessibilityservice" 
      android:resource="@xml/accessibility_service_config" /> 
</service> 

Unter res/xml erstellen accessibility_service_config.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:description="@string/accessibility_service_description" 
    android:packageNames="com.android.phone,com.ats.android.activationcodebot" 
    android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged" 
    android:accessibilityFlags="flagDefault" 
    android:accessibilityFeedbackType="feedbackSpoken" 
    android:notificationTimeout="100" 
    android:canRetrieveWindowContent="true" 
    /> 

Natürlich können Sie diesen Code auf Ihre eigenen Bedürfnisse anpassen.

Schließlich müssen Sie den Zugänglichkeitsdienst manuell unter Einstellungen> Erreichbarkeit in Android aktivieren (oder den Benutzer bitten, dies zu tun).

Lesen Sie mehr ...Developing an Accessibility Service

+0

Ich werde das versuchen, sobald ich heute nach Hause komme und Sie wissen lassen, ob es für mich klappt. Es ist ähnlich dem Code, den ich bereits habe, aber mein Code "klickt" aus irgendeinem Grund nicht immer auf den Bildschirm. – Jayce

+0

Ich habe Ihren Code nicht gesehen, aber stellen Sie sicher, dass Sie den gesamten Baum durchlaufen, um nach der gewünschten anklickbaren Ansicht zu suchen. –

+0

Stellen Sie sicher, dass Sie kein Instanz- oder Klassenfeld für die temporäre Speicherung in 'onAccessibilityEvent()' verwenden, da dies das Threads unsicher machen würde. Wenn Sie wirklich mit einem Instanzfeld arbeiten müssen, verwenden Sie 'synchronized (lockObject) {}', um sicherzustellen, dass alle Aufrufe von 'onAccessibilityEvent()' securely ausgeführt werden. –

3

Um in der Lage sein, von einer anderen App zu tun, die Sie benötigen um den Bildschirm zu erfassen und die Textposition mithilfe des Texterkennungsdienstes zu bestimmen.

Wenn eine andere Anwendung aktiv ist, sollte Ihre Anwendung aktiv sein, um den Bildschirm erfassen zu können. Sie können also nur den Android-Dienst verwenden, der immer im Hintergrund funktioniert.

jedoch ScreenShot für Ihre Aktivität zu erfassen Sie haben einen Blick auf Ihre activity benötigen, und eine, die nicht vorhanden ist in Ihrem service so müssen Sie eine TimerTask machen, die Ihre Tätigkeit zu jeder Stunde anrufen und Ihre activity es reagiert mit der aktuellen Ansicht angezeigt werden und Sie können den Screenshot davon abfangen.

Oder Wenn Sie dann einen Screenshot der aktuellen Geräte Bildschirm (jede Anwendung) nehmen wollen Sie Erlaubnis zu verankern haben, und lesen framebuffer für das, was Rohdaten aktuellen Bildschirm geben konvertiert es dann in Bitmap oder eine Bilddatei können Sie es in Ihrem Service tun.

Kurz, es kann für gerootete Telefone möglich sein. Andernfalls können Sie keinen Screenshot von anderen Apps erstellen, wenn Sie nicht gerootet sind. Erlaubt nur Screenshots Ihrer App zu erstellen.

Um den Bildschirm zu analysieren, ob es "Bereit" Text oder nicht gibt. Ihre Anwendung sollte gelebt/aktiviert werden, um den Bildschirm erfassen zu können.

+0

Ich benutze AccessibilityNodeInfo, und ich glaube, ich habe alles funktioniert jetzt, keine Wurzel benötigt. Ich muss nur ein paar mehr Tweaks herausfinden und ich sollte auf dem richtigen Weg sein. – Jayce

0

Anstatt zu versuchen, Text zu lesen, benutze einen Broadcast-Empfänger und überprüfe bei jeder Sendung die Textansichtslänge, wenn sie eingestellt ist, starte eine App oder mache, was immer du willst.

+0

Haben Sie ein Beispiel? – Jayce

Verwandte Themen