android - 如何在 AccessibilityService 中执行 'interrupt' 操作?

标签 android accessibilityservice

我正在尝试做什么/我已经做了什么:我正在尝试为视障用户制作一个非常基本的 TalkBack 版本。我制作了一个简单的辅助功能服务,它读取用户单击的按钮的内容描述并大声朗读。

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    // get the source node of the event
    AccessibilityNodeInfo source = event.getSource();
    if (source == null) {
        return;
    }

    // Check if a button is clicked and speak out the content
    if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED
        && BUTTON_CLASS_NAME.equals(source.getClassName()) {
            Log.d("Button clicked", source.getViewIdResourceName().toString());
            convertTextToSpeech(source.getContentDescription().toString());
        }

    if (source != null)
        source.recycle();
    return;
}

问题:但是,通过这种方式,用户无法在实际执行单击按钮时触发的操作之前收听按钮的描述。当用户听到描述时,按钮已经被点击并且 Action 已经被执行。

问题如何中断正在执行的操作(例如:单击按钮后打开一个新 Activity ),以便用户可以使用反馈安全地浏览屏幕上的当前 View 我在不开始新 Activity 或触发其他行动的情况下提供?

有点像 Talkback 中发生的事情:用户单击以听到描述,然后双击以执行操作。除非用户双击,否则 Talkback 如何防止操作发生?我研究过 TouchExplorationMode,但我猜它主要用于手势而不是点击。

最佳答案

你找错地方了。一旦 onAccessibilityEvent 收到一个事件, Action 就已经发生了。它只是通知您,发生了点击事件。现在阻止它已经太迟了。

您确实需要 TouchExplorationMode。下面是 TalkBack 处理的一个快速而粗略的实现,以及它如何使 UI 以它的方式运行,而没有大量额外的垃圾和异常处理。我只包含了与此功能相关的部分。当然还有很多其他必要的脚手架,但这会分散对关键元素的注意力。

serviceConfig.xml 的内容:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFlags="flagRequestTouchExplorationMode"
    android:canRequestTouchExplorationMode="true"
    />

A11yService.java的部分内容

@Override
public void onAccessibilityEvent(AccessibilityEvent e) {

    switch (e.getEventType()) {
        case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER: {
            e.getSource().performAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
        }
    }
}

TalkBack 然后在 onGesture 中截取手势,并捕捉向右或向左滑动的手势,并仅在 AccessibilityNode 遍历中的下一个或上一个元素上执行相同的操作(辅助功能焦点)。简单易行!

关于android - 如何在 AccessibilityService 中执行 'interrupt' 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36067686/

相关文章:

javascript - androidInterface 未定义。是什么赋予了?

java - 从 android 中的 AccessibilityService 创建对 Activity 的回调

c# - Android 不支持全局 PushAsync,请使用 NavigationPage

java - 如何在 Java/Android 中解析 JSON 日期时间

java - android辅助功能服务突然停止触发事件

android - 没有TextView时如何从accessibilityService中读取内容?

android - 使用 AccessibilityService 中的 AccessibilityNodeInfo 执行滚动

Android 11 无障碍服务权限

java - 如何在ListView中显示Map值?

android - 自动完成下拉列表需要更改布局