三星设备和无障碍服务 (ACTION_PASTE, 剪贴板)

3

我尝试在第三方应用程序中实现自动登录功能。

我尝试在登录页面上复制并粘贴用户名/密码。为了实现这一点,我使用了Android辅助服务。

我能够在不同的设备上粘贴文本。但是在Samsung设备上,用户名/密码会被粘贴到错误的输入字段中。

日志显示我复制的用户名/密码与预期相符。但是在粘贴时,它却粘贴了错误的文本。

这是我的操作:

private ClipboardManager mClipboardManager;
mClipboardManager = (ClipboardManager) getApplication().getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);

ClipData clip = ClipData.newPlainText("", textToPaste);
mClipboardManager.setPrimaryClip(clip);
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);
clip = ClipData.newPlainText("", "");
mClipboardManager.setPrimaryClip(clip);

clip = ClipData.newPlainText("", textToPaste2);
mClipboardManager.setPrimaryClip(clip);
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);
clip = ClipData.newPlainText("", "");
mClipboardManager.setPrimaryClip(clip);

你能帮我找到解决方案吗?我该如何粘贴正确的文本?

1个回答

2
我也遇到了这个问题,我注意到这是一个开放性问题。在这里也有人提出同样的问题,但它还没有得到妥善解决。该问题似乎是与三星自己的剪贴板和他们如何实现辅助功能有关的竞争条件。我已经找到了一个功能性但不太美观的解决方案:
if (Build.MANUFACTURER.toString().equals("samsung")) {
    Handler handler = new Handler();
    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            getCurrentNode().performAction(AccessibilityNodeInfo.ACTION_PASTE);
        }
    };
    handler.postDelayed(runnable, 100);
} else {
    getCurrentNode().performAction(AccessibilityNodeInfo.ACTION_PASTE);
}

所以基本上我们会等待一段时间(100毫秒,可能因人而异),让剪贴板稳定下来再进行粘贴。我承认这并不完美,但这对API 18及以上版本有效。
另一个API 21及以上版本的选择是使用AccessibilityNodeInfo.ACTION_SET_TEXT而不是粘贴(仅适用于文本),并以此方式插入正确的文本片段。以下是示例:
Bundle arguments = new Bundle();
arguments.putString(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "node text plus pasted text");
getCurrentNode().performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);

注意:上述代码不会管理光标,因此始终将其放置在文本字段的末尾。您可以使用 AccessibilityNodeInfo.ACTION_SET_CURSOR 和一个 bundle 来管理光标(类似于上面设置文本的方式)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接