AccessibilityNodeInfo.performAction()方法有时无法正常工作

时间:2016-07-26 19:21:45

标签: android accessibilityservice

我在我的应用中使用AccessibilityService将一些文字粘贴到另一个应用的EditText

我正在使用以下代码来实现相同的目标,

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

这适用于正常情况。但是,当我使用

AlertDialog打开AccessibilityService
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

按下对话框按钮执行上面的代码,行为异常

案例1:工作正常,文字从对话框中粘贴

案例2 :文字被粘贴但未进行选择,因此前一个词仍保留在字段中

案例3:没有任何反应,只是对话框解散。

但是,在所有情况下,文本都会被复制到剪贴板,并且可以手动粘贴。

任何线索?

1 个答案:

答案 0 :(得分:3)

我终于开始工作了,这是怎么回事,

最初我同时拨打Dialog.dismiss()AccessibilityNodeInfo.performAction(),这导致了冲突,因为Window持有Dialog的视图作为当前活动视图,因此无法链接到AccessibilityNode

我修改了我的代码,

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

现在每次正常工作,延迟拨打performAction()并给予Dialog完全解雇的足够时间。