2016-07-26 12 views
1

Ich verwende eine AccessibilityService in meiner App, um einen Text in die EditText einer anderen App einzufügen.AccessibilityNodeInfo.performAction() Methode funktioniert manchmal nicht

ich den folgenden Code verwenden das gleiche zu erreichen,

Bundle bundle = new Bundle(); 

bundle.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT, 
      AccessibilityNodeInfo.MOVEMENT_GRANULARITY_WORD); 
bundle.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, 
      true); 

eventSource.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, 
      bundle); 

ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("text", stringToCopy); 
clipboard.setPrimaryClip(clip); 

eventSource.performAction(AccessibilityNodeInfo.ACTION_PASTE); 

Diese für normale Fälle gut funktioniert. Allerdings, wenn ich

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 

und führen Sie den obigen Code auf Dialogtaste drückt ein AlertDialog vom AccessibilityService mit öffnen, es anormalem Verhalten.

Fall 1: Fein- und Text Works wird von Dialog

Fall geklebt 2: Text wird eingefügt aber die Auswahl nicht gemacht wird und daher bleibt das vorherige Wort im Bereich

Fall 3 : Nichts passiert, nur der Dialog wird ausgeblendet. In allen Fällen wird der Text in Clipboard kopiert und kann manuell eingefügt werden.

Irgendwelche Hinweise?

Antwort

1

ich habe es endlich, zu arbeiten, und das ist, wie,

Zunächst ruft ich, Dialog.dismiss() und AccessibilityNodeInfo.performAction() zugleich, die einen Konflikt verursacht wurde, wie die Window die Ansicht des Dialog als Holding wurde aktuelle aktive Ansicht und konnte somit nicht mit der AccessibilityNode verknüpfen.

modifizierte ich meinen Code dazu

mDialog.dismiss(); 

new Handler().postDelayed(() -> { 
    Bundle bundle = new Bundle(); 

    bundle.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT, 
      AccessibilityNodeInfo.MOVEMENT_GRANULARITY_WORD); 
    bundle.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, 
      true); 

    eventSource.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, 
      bundle); 

    ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 
    ClipData clip = ClipData.newPlainText("text", stringToCopy); 
    clipboard.setPrimaryClip(clip); 

    eventSource.performAction(AccessibilityNodeInfo.ACTION_PASTE); 
}, 300); 

Jetzt ist es jedes Mal richtig, nachdem eine Verzögerung in dem Aufruf die performAction() und gibt genügend Zeit für die Dialog zu entlassen vollständig funktioniert.