“无法在未密封的实例上执行此操作”java.lang.IllegalStateException异常
作者:互联网
随着Android AccessibilityService能够粘贴到其他应用程序EditText字段,但与浏览器测试域(模拟器默认浏览器或三星deault浏览器),它不工作,抛出错误:
Cannot perform this action on a not sealed instance.
在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"
}
}
解决方法:
我并不相信你正试图做你认为你想做的事情.
当您设置accessibilityNodeInfo的“text”时,您正在查找的是该对象的text属性,因为它与您的辅助功能服务有关.这并不意味着您正在更改accessibilityNodeInfo对象引用的EditText框的文本.当您的辅助功能服务获取此对象时,这两个对象彼此完全分离.即使您的代码成功运行,您也无法获得预期的结果.现在,至于为什么你不能执行这个动作,知道这一点应该是显而易见的.对于能够修改其拥有的节点的辅助功能服务,实际上没有意义.因此它们变得密封(将其视为常量的运行时执行).可访问性节点在其生命周期的各个点处变得密封和未密封.可以访问未密封节点信息的框架部分是View类和私有API.任何与辅助功能服务相关的任务都将处理密封的只读实例.
至于为什么你的原始解决方案不起作用,我相信我们没有足够的信息. “ACTION_PASTE”方法(近似)是正确的方法,但是,在使用Web浏览器时,存在大量问题.浏览器版本,Android版本,设备版本,网站等都发挥作用.特别是如果您的设置足够大,不能使用新的WebView(纯铬webview,而不是基于过时版本的WebKit的奇怪嵌入式移动WebView的旧方法,现在永远不会更新).我建议您使用最新的Nexus设备测试您的代码,至少使用Android 5.0并查看您的代码是否有效.如果您无法执行此操作,请报告您的设置的版本信息.如果你已经在哪个网站上?
标签:java,android,android-service,accessibilityservice 来源: https://codeday.me/bug/20190516/1116840.html