android - 三星设备和辅助功能服务(ACTION_PASTE、剪贴板)

标签 android clipboard samsung-mobile accessibilityservice clipboardmanager

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

我尝试在登录页面复制并粘贴用户名/密码。为了实现它,我使用了 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);

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

最佳答案

我也有这个问题,我注意到这是一个悬而未决的问题 here也没有得到妥善解决。这个问题似乎是三星自己的剪贴板的竞争条件,以及他们如何实现辅助功能来处理它。我有一个功能正常但不太漂亮的解决方案:

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 毫秒,YMMV)。我承认这并不完美,但这适用于 API 18+。

API 21+ 的另一个选项是使用 AccessibilityNodeInfo.ACTION_SET_TEXT 而不是粘贴(显然仅用于文本),并以这种方式插入正确的文本 fragment 。以下是其工作原理的示例:

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 管理光标(与上面设置文本的方式类似)

关于android - 三星设备和辅助功能服务(ACTION_PASTE、剪贴板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587624/

相关文章:

javascript - 使用 listView 和 PouchDb 的 Ionic (v1) 应用程序问题

Android 使用 MediaRecorder 从 SURFACEVIEW 录制视频

android - 正在运行的 Activity 未从小部件显示在前面

android - 无法确定任务 ':app:uploadCrashlyticsMappingFileRelease' 与 Google 版本 4.3.9 的依赖关系

android - 如何处理来自 ContentResolver.applyBatch 的 "SQLiteException: null"?

c++ - 想要将 "GdkPixbuf"转换为 "GtkSelectionData"对象

c - 如何用 C 将数据保存到 MacOSX 上的剪贴板

delphi - 将文件复制到剪贴板

android - 如何更改首选项屏幕中的开关按钮颜色?

java - 如何使用标准 API 访问 Galaxy s5 上的心率传感器?