"无法在未密封的实例上执行此操作" java.lang.IllegalStateException异常

时间:2015-09-26 09:32:07

标签: java android android-service accessibilityservice

将android AccessibilityService能够粘贴到其他应用EditText字段中,但使用浏览器testfields(模拟器默认浏览器或三星deault浏览器),它无效,抛出错误:

  

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

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

 @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"
    }
}   

1 个答案:

答案 0 :(得分:7)

我不相信你正试图做你认为你想做的事情。

当您设置accessibilityNodeInfo的“text”时,您正在查找的是该对象的text属性,因为它与您的辅助功能服务有关。这并不意味着您正在更改accessibilityNodeInfo对象引用的EditText框的文本。当您的辅助功能服务获取此对象时,这两个对象彼此完全分离。即使您的代码成功运行,您也无法获得预期的结果。现在,至于为什么你不能执行这个动作,知道这一点应该是显而易见的。对于能够修改其拥有的节点的辅助功能服务,实际上没有意义。因此它们变得密封(将其视为常量的运行时执行)。可访问性节点在其生命周期的各个点处变得密封和未密封。可以访问未密封节点信息的框架部分是View类和私有API。任何与辅助功能服务相关的任务都将处理密封的只读实例。

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