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

时间:2015-11-20 10:42:55

标签: android accessibility accessibilityservice accessibility-api

我有一个AccessibilityEvent可以自动停止应用。但是当启动app info intent时,它会进入无限循环的开启/关闭警告对话框。

我该如何预防呢?这是代码:

 @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);
                }
                }
            }

顺便说一下,在应用信息意图开始后立即点击force_stop_button的想法是什么意思?

编辑:我认为问题出在AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED。如果我绕过那个检查,它可以工作,但真的很难控制。

1 个答案:

答案 0 :(得分:2)

在您的代码中,只要AccessibilityService在“设置”活动中检测到“强制停止”按钮,就会单击该按钮。 现在,将显示一个对话框,其中包含两个按钮:Ok&amp;取消。 然后,您将在取消按钮上执行点击操作。

所以,App Info - &gt;对话 - &gt;取消 - &gt;应用信息 - &gt;对话 - &gt;取消......

是你将获得的循环。

更改list = nodeInfo.findAccessibilityNodeInfosByText("CANCEL");

list = nodeInfo.findAccessibilityNodeInfosByText("OK");

要点击某个节点,您必须添加一些延迟:

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