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

时间:2015-02-16 15:47:50

标签: android accessibility text-to-speech android-menu talkback

是否可以以任何方式在菜单项上设置辅助功能代理?我的应用程序使用文本到语音转换,我希望在之前执行一些自定义代码: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) {
    }

1 个答案:

答案 0 :(得分:1)

除非小心处理,否则您的应用程序可以被视为WCag 2.0,准则2.2.2下无法访问的内容。

解决方案1:根据此指南,处理此方案的正确方法是为用户提供手动启动/停止/暂停内容的功能。这应该很容易实现。仅此一项就足够了,并且确实是所有3种解决方案都需要的。

解决方案2:另一种方法是,当您检测到辅助功能引擎处于活动状态时,不会进行自己的语音合成。使用ACCESSIBILITY_LIVE_REGION_POLITE将您的网络视图标记为liveRegion。然后让对讲抓住你的更新内容描述,其中应该包含当前突出显示的句子的文本。这使得TalkBack能够确定何时宣布什么。这样做的另一个好处是,即使您的区域处于活动状态并提供大量反馈,它也会以可预测的方式表现为TalkBack用户。因此,它不太可能违反WCag 2.2.2,尽管你仍然要小心!并且可能仍需要提供暂停内容的功能。

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