java - "Cannot perform this action on a not sealed instance"java.lang.IllegalStateException异常

标签 java android android-service accessibilityservice

使用 android AccessibilityService 可以粘贴到其他应用程序的 EditText 字段,但是使用浏览器 testfields (Emulator Default Browser 或 Samsung deault Browser) 它不工作,抛出错误:

Cannot perform this action on a not sealed instance.

在带有某些 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"
    }
}   

最佳答案

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

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

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

关于java - "Cannot perform this action on a not sealed instance"java.lang.IllegalStateException异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795662/

相关文章:

android - 如何在 Android 中以编程方式将 adjustViewBounds 设置为 true?

android - 如何在android中关闭通知的振动

java - 为什么 UIComponentBase 类不公开 setAttribute() 方法?

java - 使用线程循环数组

java - int 与 int 相配 (1+1=11)

javascript - AngularJS 和 SpringMVC 在同一个项目中

android - 在 android 上打开主要的 SMS 对话 Intent

android - Android 中 ArrayAdapter 的奇怪行为

android - 如何在从服务类更新的 Activity 的文本字段中显示值?

android - 对于积极重复的警报,哪个更好 Alarm 或 Service with Timer 任务?