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

Gul*_*ngh 7 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"
    }
}   
Run Code Online (Sandbox Code Playgroud)

Chr*_*sCM 7

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

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

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

  • 怎么会有这么多人点赞呢?这个答案中包含的咆哮是不正确的:ACTION_SET_TEXT实际上是为了允许辅助服务更改原始小部件中的文本——performAction是一个桥梁,只要您的服务具有适当的权限即可。您的答案也没有解决节点尚未/不再密封的事实,这是真正的问题,并且阻止了大多数操作(甚至只是通过其 API 获取较少的琐碎信息):节点要么尚未准备好,要么已经准备好由某物回收()。 (4认同)
  • Sealed 本质上是 Android 操作系统强制执行“恒定”类型关系的方式。您可以获得两种类型的 ANI。密封实例来自 AccessibilityEvents,未密封实例来自 getRootInActiveWIndow() 并递归遍历其中的子级。从 AccessibilityEvents 接收的 ANI 与从 getRootInActiveWindow 遍历接收的 ANI 之间的关系要松散得多,特别是与频繁发送的 AccessibilityEvents(图片快速滚动内容)相关。 (2认同)