在使我的应用程序可访问时,我遇到了一个问题 - 没有办法让它成为SPEAK !!
通过引用谷歌的库,我做了
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event)
在我的自定义视图上,我得到正确的事件消息 - 我使用Log.d检查了它
但是,没有办法让对话说话......
我的应用程序从API8运行,所以我也不能使用,
onPopulateAccessibilityEvent()
我错了吗?请有人帮助我......
答案 0 :(得分:2)
我需要在使用新数据集重新加载RecyclerView
个项目后,宣布按钮何时可见。 RecyclerView
是一个框架视图,它支持开箱即用的对讲/可访问性。在加载新数据之后,对讲宣布"显示z"的项目x到y;自动。利用TTS API来解决我提到的用例,引入了以下陷阱:
shutdown()
管理资源,将您与Activity
每个文档的生命周期联系起来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)
announceForAccessibility
方法可能在此达到目的。它是在API级别16中引入的。更多详细信息here。