Android 有办法让对讲机说话吗?
在使我的应用程序可访问时,我遇到了一个问题-没有办法让它说话 通过引用谷歌的图书馆,我可以Android 有办法让对讲机说话吗?,android,accessibility,talkback,Android,Accessibility,Talkback,在使我的应用程序可访问时,我遇到了一个问题-没有办法让它说话 通过引用谷歌的图书馆,我可以 public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) 在我的自定义视图中,我得到了正确的事件消息-我使用Log.d检查了它 但是,没有办法让对讲机说话… 我的应用程序从API8运行,因此我不能同时使用 onPopulateAccessibilityEvent() 我想错了吗?请有人帮帮我…如果您想让它说话
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event)
在我的自定义视图中,我得到了正确的事件消息-我使用Log.d检查了它但是,没有办法让对讲机说话…
我的应用程序从API8运行,因此我不能同时使用
onPopulateAccessibilityEvent()
我想错了吗?请有人帮帮我…如果您想让它说话,请使用TextToSpeech API。它获取一个字符串并将其读出。我需要宣布在使用新数据集重新加载
RecyclerView
的项目后按钮何时可见RecyclerView
作为一个框架视图,它支持即时对讲/可访问性。加载新数据后,talkback会自动宣布“显示z的x到y项”。利用TTS API解决我提到的用例会引入以下陷阱:
- 由于以下原因,TTS实例的初始化和管理非常繁琐且有问题:
- 使用onInit侦听器管理TTS实例生命周期
- 管理区域设置
- 通过
管理资源将您与每个文档的shutdown()
活动的生命周期联系起来
- ,这似乎是一种调用
以释放TTS资源的糟糕机制shutdown()
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)
}
}
}
}
}
从任何需要的地方调用上面的方法(我在我的基本活动中添加了一个转发给助手的方法)。这将把公告插入到对讲消息队列中,以便大声宣布,并且不需要处理TTS实例。最后,我在最终实现中添加了延迟参数和机制,以将这些事件与正在进行的ui触发事件分开,因为它们有时会覆盖手动通知。对于希望用Java实现@Carter Hudson代码的人(不要评判我,因为我在2019年还没有使用Kotlin):
announceForAccessibility
在视图类中定义的方法可能用于此目的。它是在API级别16中引入的。更多详细信息。Thx!!这是解决问题的非常简单的方法!!您是否在设备设置>辅助功能部分打开了对讲功能?
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);
}