我正在我的应用程序中使用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);

这在正常情况下很有效。但是,当我使用
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

并在按对话框按钮时执行上述代码,其行为异常。
案例1:工作正常,文本从对话框粘贴
案例2:文本被粘贴,但未进行选择,因此前一个单词保留在字段中
案例3:什么也没发生,只是对话被取消了。
但是,在所有情况下,文本都会被复制到剪贴板,并且可以手动粘贴。
有线索吗?

最佳答案

我终于成功了,就是这样,
最初,我同时调用了Dialog.dismiss()AccessibilityNodeInfo.performAction(),这导致了冲突,因为WindowDialog的视图作为当前活动视图,因此无法链接到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足够的时间完全关闭之后。

关于android - AccessibilityNodeInfo.performAction()方法有时不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38598239/

10-10 20:00