0

我有一个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);
                }
                }
            }

force_stop_button顺便说一句,在应用信息意图开始后立即获得点击的任何想法?

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

4

1 回答 1

2

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

所以,App Info -> Dialog -> Cancel -> App Info -> Dialog -> Cancel ...

是你会得到的循环。

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

list = nodeInfo.findAccessibilityNodeInfosByText("OK");

为了点击一个节点,你必须添加一些延迟:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
    }
}, 300);
于 2015-12-12T18:32:06.790 回答