AccessibilityNodeInfo.performAction() 方法有时不起作用
AccessibilityNodeInfo.performAction() Method not working sometimes
我在我的应用程序中使用 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);
这适用于正常情况。但是,当我使用
从 AccessibilityService
打开一个 AlertDialog
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
并在按下对话框按钮时执行上述代码,表现异常。
案例 1: 工作正常,文本从对话框中粘贴
情况 2: 粘贴了文本但未进行选择,因此前一个词保留在字段中
案例 3:什么都没有发生,只是对话框消失了。
但是,在所有情况下,文本都会被复制到剪贴板,并且可以手动粘贴。
有什么线索吗?
我终于让它工作了,就是这样,
最初我同时调用 Dialog.dismiss()
和 AccessibilityNodeInfo.performAction()
,这引起了冲突,因为 Window
持有 Dialog
的观点当前活动视图,因此无法 link 到 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
提供足够的时间完全关闭后,现在它每次都能正常工作。
我在我的应用程序中使用 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);
这适用于正常情况。但是,当我使用
从AccessibilityService
打开一个 AlertDialog
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
并在按下对话框按钮时执行上述代码,表现异常。
案例 1: 工作正常,文本从对话框中粘贴
情况 2: 粘贴了文本但未进行选择,因此前一个词保留在字段中
案例 3:什么都没有发生,只是对话框消失了。
但是,在所有情况下,文本都会被复制到剪贴板,并且可以手动粘贴。
有什么线索吗?
我终于让它工作了,就是这样,
最初我同时调用 Dialog.dismiss()
和 AccessibilityNodeInfo.performAction()
,这引起了冲突,因为 Window
持有 Dialog
的观点当前活动视图,因此无法 link 到 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
提供足够的时间完全关闭后,现在它每次都能正常工作。