Android - 如何在菜单项上设置辅助功能委托?

Android - How to set an Accessibility Delegate on a Menu Item?

是否可以通过任何方式在菜单项上设置辅助功能委托?我的应用程序使用文本到语音转换,我想在之前 TalkBack 开始说出我的菜单项的内容描述(当菜单项获得辅助功能焦点时发生)执行一些自定义代码。否则,我的应用中的文字转语音将与 TalkBack 的文字转语音发生冲突。

更新: 我的应用程序从 WebView 中获取一个句子,突出显示它并使用 TTS 引擎读取它。说完句子后,onDone() 回调会启动相同的方法,但会启动下一句话。

由于 TalkBack 和我的应用使用相同的 TTS 引擎,因此一次只允许说一种话语。因此,我的应用正在逐句阅读其 WebView 句子,但随后用户将注意力集中在菜单项上,TalkBack 将阅读其描述。因为我的讲话被打断了,onDone() 会被调用(onDone() 无法区分是说完还是被打断),所以会调用 speakNextSentence(),尽管我之前的句子可能只说了两句就被打断了字。 我想在触发菜单项的可访问性事件之前以某种方式将 isPaused 布尔值设置为 true。

private class ttsUtteranceListener extends UtteranceProgressListener {

    @Override
    public void onStart(String utteranceId) {
    }

    @Override
    public void onDone(final String utteranceId) {
        if (!isPaused) {   
            ...
            speakNextSentence();
            ...
        }
    }

    @Override
    public void onError(String utteranceId) {
    }

根据 WCag 2.0 准则 2.2.2,除非小心处理,否则您的应用程序的功能可能被视为不可访问。

解决方案 1:根据本指南,处理这种情况的正确方法是为用户提供手动 start/stop/pause 内容的能力。这应该很容易实现。仅此一项就足够了,而且所有 3 种解决方案都确实需要它。

解决方案 2:执行此操作的另一种方法是,当您检测到辅助功能引擎处于活动状态时,不进行自己的语音合成。使用 ACCESSIBILITY_LIVE_REGION_POLITE 将您的 webview 标记为 liveRegion。然后让 talkback 抓住你更新的 contentDescriptions,它应该包含当前突出显示的句子的文本。这让 TalkBack 负责确定何时宣布什么。这有一个额外的好处,即使您的区域处于活动状态并提供大量反馈,它也会以可预测的方式对 TalkBack 用户进行操作。因此它不太可能违反 WCag 2.2.2,但您仍然应该小心!并且可能仍然需要提供暂停内容的能力。

解决方案 3:Android MenuItem 没有实现所有可访问性 API 回调。例如,如果您的 MenuItems 是按钮,则解决方案是覆盖 onRequestSendAccessibilityEvent 并查找 TYPE_VIEW_ACCESSIBILITY_FOCUSED。但是 MenuItems 没有实现这个 API。因此,您可以编写自己的菜单,使用实现这些 API 的元素,并按照您想要的方式进行。不过,正如我之前提到的,我不推荐这种方法。这种方法很可能违反了 WCag 2.0 可访问性指南。