宝贝霓 2025-04-22 13:22 采纳率: 0%
浏览 59

使用无障碍服务AccessibilityService,遇到点击失败的问题

使用无障碍服务AccessibilityService,遇到点击失败的问题,节点和它的父节点实际上都是可以点击的,但代码中给他们执行点击操作时只有父节点能成功,也试过模拟点击事件、延迟点击、多点触摸等方式,通通不起作用

img

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-04-22 13:22
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    使用无障碍服务AccessibilityService,遇到点击失败的问题

    你使用了AccessibilityService来模拟点击操作,但是遇到了点击失败的问题,父节点可以点击,但是子节点不能点击。这可能是因为AccessibilityService的点击事件处理机制不同于正常的点击事件。

    可以尝试以下解决方案:

    1. 使用performClick()方法来模拟点击事件,这个方法可以模拟出正常的点击事件。
    AccessibilityNodeInfo node = ...;
    node.performClick();
    
    1. 使用dispatchKeyEvent()方法来模拟点击事件,这个方法可以模拟出键盘事件。
    AccessibilityNodeInfo node = ...;
    KeyEvent event = KeyEvent.obtain(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
    node.dispatchKeyEvent(event);
    event.recycle();
    
    1. 使用performAction()方法来模拟点击事件,这个方法可以模拟出特定的操作。
    AccessibilityNodeInfo node = ...;
    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
    
    1. 检查AccessibilityService是否已经激活,如果没有激活,可以使用AccessibilityManager来激活它。
    AccessibilityManager accessibilityManager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
    if (!accessibilityManager.isEnabled()) {
        accessibilityManager.setEnabled(true);
    }
    
    1. 检查AccessibilityNodeInfo是否已经获取到了正确的节点,如果没有,可以使用getRootInActiveWindow()方法来获取当前活动窗口,然后使用findAccessibilityNodeInfosByClassName()方法来获取指定的节点。
    AccessibilityNodeInfo node = ...;
    AccessibilityNodeInfo root = getRootInActiveWindow();
    List<AccessibilityNodeInfo> nodes = root.findAccessibilityNodeInfosByClassName("android.widget.Button");
    for (AccessibilityNodeInfo n : nodes) {
        if (n.equals(node)) {
            // 执行点击操作
        }
    }
    

    如果以上解决方案都不能解决问题,可以提供更多的代码和日志信息,以便更好地帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月22日