10

使用 androidAccessibilityService可以粘贴到其他应用程序EditText字段,但使用浏览器testfields(模拟器默认浏览器或三星默认浏览器)它不起作用,抛出错误:

无法对未密封的实例执行此操作。

在带有一些 singnup 文本字段的 android chrome 浏览器中,它可以工作,但不适用于所有文本字段。

 @Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    AccessibilityNodeInfo source = event.getSource();
    if (source != null && ( event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED ) ) {
            // || event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED ) &&
            //event.getClassName().equals("android.widget.EditText")
            //) {
        ctx = getApplicationContext();
        ClipboardManager clipboard = (ClipboardManager) ctx.getSystemService(Context.CLIPBOARD_SERVICE);
        ClipData clip = ClipData.newPlainText("label", "XYZ");
        clipboard.setPrimaryClip(clip);
        source.performAction(AccessibilityNodeInfo.ACTION_PASTE); 
        //Not Working, always return false.

        //Tried with other options
        Bundle argumentsTest = new Bundle();
        argumentsTest.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "Bundle Test Data");
        source.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT,argumentsTest )
        // Not Working, throw java.lang.IllegalStateException exception
        //Message: "Cannot perform this action on a not sealed instance"
    }
}   
4

1 回答 1

7

我不相信您正在尝试做您认为您正在尝试做的事情。

当您设置accessibilityNodeInfo 的“文本”时,您正在更改的是该对象的文本属性,因为它与您的无障碍服务有关。这并不意味着您正在更改 EditText 框的文本,accessibilityNodeInfo 对象引用。当您的无障碍服务获得这个对象时,这两个对象已经完全分开了。即使您的代码成功运行,您也不会得到您期望的结果。现在,至于为什么您不能执行此操作,知道这一点应该是显而易见的。对于能够修改其拥有的节点的可访问性服务来说,这并没有什么意义。因此它们变得密封(将其视为常量的运行时强制执行)。可访问性节点在其生命周期的不同时间点被密封和解封。可以访问未密封节点信息的框架部分是视图类和私有 API。任何与可访问性服务相关的任务都将处理密封的只读实例。

至于为什么你原来的解决方案不起作用,我相信我们没有足够的信息。“ACTION_PASTE”方法(大约)是正确的方法,但是,在使用 Web 浏览器时会出现很多问题。浏览器版本、Android 版本、设备版本、网站等都在起作用。特别是如果您的设置足够老而不能使用新的 WebView(纯铬 webview,而不是基于过时版本的 WebKit 的奇怪嵌入式移动 WebView 的旧 4.+ 方法,现在永远不会更新)。我建议在最新的 Nexus 设备上测试您的代码,至少使用 Android 5.0 并查看您的代码是否有效。如果您不能这样做,请报告您的设置的版本信息。如果你已经是,在哪个网站上?

于 2015-09-28T18:59:39.997 回答