我正在尝试做的事情/已经完成的事情:我正在尝试为视障用户制作非常基本的TalkBack版本。我做了一个简单的辅助功能服务,它读取用户单击的按钮的contentDescription并大声读出。

@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 或触发其他 Activity 行动?

类似于“话语提示”中发生的事情:用户单击以收听描述,而双击则执行操作。除非用户双击,对讲如何阻止操作发生?我研究了 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);
        }
    }
}

然后,“话语提示”会拦截onGesture中的手势,并向右或向左滑动即可捕获它们,然后仅对AccessibilityNode遍历的下一个或上一个元素执行相同的操作(可访问性焦点)。十分简单!

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

10-12 06:08