3

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

我尝试在登录页面中复制并粘贴用户名/密码。为了实现它,我使用了 Android 无障碍服务。

我可以在不同的设备上粘贴文本。但在三星设备上,用户名/密码粘贴在错误的输入文件中。

日志显示用户名/密码正在按预期复制。但是在粘贴时会粘贴错误的文本。

这就是我所做的:

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

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

4

1 回答 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);
}

所以基本上我们在粘贴之前等待剪贴板稳定下来(100ms,YMMV)。我承认这并不完美,但这适用于 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(以与上面类似的方式设置文本)

于 2015-04-17T19:49:25.970 回答