有没有办法让对讲说话?

时间:2013-04-02 05:46:59

标签: android accessibility talkback

在使我的应用程序可访问时,我遇到了一个问题 - 没有办法让它成为SPEAK !!

通过引用谷歌的库,我做了

public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event)

在我的自定义视图上,我得到正确的事件消息 - 我使用Log.d检查了它 但是,没有办法让对话说话......
我的应用程序从API8运行,所以我也不能使用,

onPopulateAccessibilityEvent()

我错了吗?请有人帮助我......

4 个答案:

答案 0 :(得分:2)

我需要在使用新数据集重新加载RecyclerView个项目后,宣布按钮何时可见。 RecyclerView是一个框架视图,它支持开箱即用的对讲/可访问性。在加载新数据之后,对讲宣布"显示z"的项目x到y;自动。利用TTS API来解决我提到的用例,引入了以下陷阱:

  • 由于以下原因,TTS实例初始化和管理很麻烦且有问题:
    • 使用onInit侦听器管理TTS实例生命周期
    • 管理区域设置
    • 通过shutdown()管理资源,将您与Activity每个文档的生命周期联系起来
    • An Activity's onDestroy is not guaranteed to be called,这似乎是调用shutdown()以释放TTS资源的不良机制。

更简单,更易于维护的解决方案是与TalkBack很好地配合使用,并使用Accessibility API,如下所示:

class AccessibilityHelper {
    companion object {
        @JvmStatic
        fun announceForAccessibility(context: Context, announcement: String) {
            context
                .getSystemService(ACCESSIBILITY_SERVICE)
                .let { it as AccessibilityManager }
                .let { manager ->
                    AccessibilityEvent
                        .obtain()
                        .apply {
                            eventType = TYPE_ANNOUNCEMENT
                            className = context.javaClass.name
                            packageName = context.packageName
                            text.add(announcement)
                        }
                        .let {
                            manager.sendAccessibilityEvent(it)
                        }
                }
        }
    }
}

从您需要的任何地方调用上面的内容(我向我的基本活动添加了一个转发给帮助程序的方法)。这会将通知插入到TalkBack的消息队列中,以便大声宣告并且不需要处理TTS实例。我最终在最终实现中添加了延迟参数和机制,将这些事件与正在进行的ui触发事件分开,因为它们有时会覆盖手动通知。

答案 1 :(得分:0)

如果您想要它,请使用TextToSpeech API。它需要一个字符串并将其读出来。

答案 2 :(得分:0)

对于希望在Java中实现@Carter Hudson的代码的人(不要判断我,因为我在2019年仍未使用Kotlin):

AccessibilityManager accessibilityManager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
AccessibilityEvent accessibilityEvent = AccessibilityEvent.obtain();
accessibilityEvent.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);

accessibilityEvent.getText().add("Text to be spoken by TalkBack");
if (accessibilityManager != null) {
    accessibilityManager.sendAccessibilityEvent(accessibilityEvent);
}

答案 3 :(得分:0)

在View类中定义的

announceForAccessibility方法可能在此达到目的。它是在API级别16中引入的。更多详细信息here