Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 阻止onAccessibilityEvent(AccessibilityEvent事件)进入无限循环_Android_Accessibility_Accessibilityservice_Accessibility Api - Fatal编程技术网

Android 阻止onAccessibilityEvent(AccessibilityEvent事件)进入无限循环

Android 阻止onAccessibilityEvent(AccessibilityEvent事件)进入无限循环,android,accessibility,accessibilityservice,accessibility-api,Android,Accessibility,Accessibilityservice,Accessibility Api,我有一个AccessibilityEvent可以自动停止应用程序。但当启动应用程序信息意图时,它会进入打开/关闭警报对话框的无限循环 我怎样才能预防它?代码如下: @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event .getEventType()) {

我有一个
AccessibilityEvent
可以自动停止应用程序。但当启动应用程序信息意图时,它会进入打开/关闭警报对话框的无限循环

我怎样才能预防它?代码如下:

 @Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event
            .getEventType()) {
        AccessibilityNodeInfo nodeInfo = event.getSource();
        if (nodeInfo == null) {
            return;
        }

            List<AccessibilityNodeInfo> list = nodeInfo
                    .findAccessibilityNodeInfosByViewId("com.android.settings:id/force_stop_button");
                for (AccessibilityNodeInfo node : list) {
                    Log.i(TAG, "check1 = " + check);
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    check = true;
                }

                list = nodeInfo
                        .findAccessibilityNodeInfosByText("CANCEL");
                for (AccessibilityNodeInfo node : list) {
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
                }
            }
@覆盖
AccessibilityEvent上的公共无效(AccessibilityEvent事件){
如果(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)=事件
.getEventType()){
AccessibilityNodeInfo nodeInfo=event.getSource();
如果(nodeInfo==null){
返回;
}
列表=节点信息
.findAccessibilityNodeInfosByViewId(“com.android.settings:id/force_stop_按钮”);
用于(AccessibilityNodeInfo节点:列表){
Log.i(标记“check1=“+check”);
节点性能(AccessibilityNodeInfo.ACTION\u单击);
检查=正确;
}
列表=节点信息
.findAccessibilityNodeInfosByText(“取消”);
用于(AccessibilityNodeInfo节点:列表){
节点性能(AccessibilityNodeInfo.ACTION\u单击);
}
}
}
顺便问一下,在应用程序信息意图启动后立即点击
强制停止按钮


编辑:我认为问题出在
可访问性事件中。键入\u WINDOW\u STATE\u CHANGED
。如果我绕过该检查,它会工作,但确实很难控制。

在您的代码中,每当AccessibilityService在“设置”活动中检测到强制停止按钮时,就会单击该按钮。 现在,将显示一个带有两个按钮的对话框:确定和取消。 然后在“取消”按钮上执行单击操作

所以,应用程序信息->对话框->取消->应用程序信息->对话框->取消

这就是你将得到的循环

更改
list=nodeInfo.findAccessibilityNodeInfosByText(“取消”)

to
list=nodeInfo.findAccessibilityNodeInfosByText(“确定”)

要单击节点,必须添加一些延迟:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
    }
}, 300);

事实上这不是我想问的。因为它甚至没有点击“强制停止”。那么我为什么要关心单击“取消”或“确定”?在我现在的代码中,实际上有一些“延迟”代码。但它非常被动。首先,如果我的手机刚刚完成了一项非常繁重的工作,并且我运行了这段代码,300毫秒似乎是不够的。其次,我认为应该延迟的代码是“findnode”,而不是“performation”代码。但无论如何,一票赞成:迪亚,但我确实认为推迟表演会奏效。无论如何,谢谢你;)我也在做同样的事情,我的应用程序也崩溃了。你能建议你做了什么来纠正这个问题吗?崩溃?有日志吗?过了一会儿就崩溃了。在日志中,它是“将代码缓存容量增加到128KB”将代码缓存容量增加到256KB“…”像这样将代码缓存容量增加到512KB,然后崩溃听起来像内存泄漏:顺便说一句,使用findAccessibilityNodeInfosByText(字符串)是一个选项:))