Android对讲公告本地化

时间:2017-06-08 04:49:32

标签: android accessibility talkback

我有一个duo lingo(英语+西班牙语)android应用程序。我正在我的应用程序中实现辅助功能,我希望Talkback能够阅读西班牙语中的西班牙语单词和英语中的英语单词。英语和西班牙语单词将在单独的文本视图中。我的应用程序区域设置是英语,因此Talkback +谷歌文本到语音引擎不会读取西班牙语的西班牙语单词,它们用英语阅读,更常见的是它们的字母被读出(预期的行为)。

是否有任何解决方案或Android推荐的解决方案来实现相同的目标。

最终,我希望Talkback或自定义辅助功能服务能够用英语读出英语单词,用西班牙语读出西班牙语单词。

2 个答案:

答案 0 :(得分:1)

免责声明:您必须非常小心这个解决方案!覆盖TalkBack的TTS行为非常非常粗略。从可访问性的角度来看,有许多边缘情况可能会使这种行为变得笨拙,笨拙且非常糟糕。仅当公告的样式是特定于应用程序和必需功能的行为时,才应使用此解决方案。否则,此解决方案会破坏与用户代理兼容的各种WCAG 2.0成功标准,从可访问性/可用性的角度来看,这通常是一个糟糕的想法!

在很多情况下,当我看到这样的问题时,我对提供答案犹豫不决,以免给开发人员提供他们不了解的工具。请不要在典型的应用程序中这样做,这是一个糟糕的主意。话虽如此,我相信这种特殊情况需要它,鉴于这种情况,这是一个非常干净的解决方案。在创建活动时,请执行以下操作:

findViewById(android.R.id.content).setAccessibilityDelegate(new View.AccessibilityDelegate() {

    private TextToSpeech mTts = new TextToSpeech(MainActivity.this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            mTts.setLanguage(new Locale("es"));
            //Probably other things you should do to ensure TTS is initialized before requesting it speaks something.
        }
    });

    private boolean isSpanishView(View view) {
        return true;
    }

    @Override
    public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {

        switch (event.getEventType()) {
            case AccessibilityEvent.TYPE_ANNOUNCEMENT:
            case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
                if (isSpanishView(child)) {
                    String speakableText = null;

                    if (event.getText() != null) {
                        speakableText = event.getText().toString();
                    } else if (event.getContentDescription() != null) {
                        speakableText = event.getContentDescription().toString();
                    }

                    if (speakableText != null) {
                        mTts.speak(speakableText.toString(), TextToSpeech.QUEUE_ADD, null);

                        //Prevent the default propagation of this event, have have handled it.
                        return false;
                    }
                }
            }

            default:
                return super.onRequestSendAccessibilityEvent(host, child, event);
        }
    }
});

基本上我们在这里说的是将可访问性委托附加到我们活动的根视图。查看弹出的所有可访问性事件。检查是否是宣布某事的事件。如果是,请检查它是否包含西班牙文本。如果是,请允许我们的西班牙语TTS引擎宣布它,而不是允许通风口传播。在所有其他情况下让android做它的事情。

答案 1 :(得分:0)

谷歌宣布了一项更新,允许您指定要大声朗读文本的语言。这里提供了链接答案:https://stackoverflow.com/a/44461540/494879