如何在AccessibilityService中“中断”正在执行的操作?

5
我正在尝试制作一款针对视力障碍用户的基础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;
}
问题:但是这样用户在执行单击按钮时无法先听到按钮的描述。当用户听完描述时,按钮已经被点击并且动作已经被执行。

问题: 我如何中断动作(例如:单击按钮后打开一个新的活动)以便用户可以安全地探索屏幕上当前的视图,并提供反馈,而不会启动新的活动或触发其他动作?

有点像Talkback中所发生的:用户单击来听取描述,双击来执行操作。Talkback如何防止动作发生,除非用户双击?我已经研究了TouchExplorationMode,但我想它主要用于手势而不是点击。

1个回答

2

您正在寻找错误的位置。一旦onAccessibilityEvent接收到事件,操作已经发生。它只是通知您点击事件已经发生。现在停止已经太晚了。

您确实想要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遍历中的下一个或上一个元素上执行相同的操作(无障碍焦点)。非常简单!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接