1

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

通过引用谷歌的图书馆,我

public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event)

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

onPopulateAccessibilityEvent()

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

4

4 回答 4

5

对于希望在 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);
}
于 2019-09-13T19:44:33.143 回答
4

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

  • TTS 实例初始化和管理繁琐且值得商榷,原因如下:
    • 使用 onInit 监听器管理 TTS 实例生命周期
    • 管理区域设置
    • shutdown()通过将您与Activity每个文档的生命周期联系起来管理资源
    • 不能保证调用 Activity 的 onDestroy,这似乎是一种糟糕的调用机制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 触发事件分开,因为它们有时会覆盖手动通知。

于 2018-04-27T19:50:02.383 回答
0

如果您想让它说话,请使用 TextToSpeech API。它需要一个字符串并大声读出它。

于 2013-04-02T05:53:51.080 回答
0

announceForAccessibilityView 类中定义的方法可能在这里起到了作用。它是在 API 级别 16 中引入的。更多详细信息请点击此处

于 2019-10-29T22:57:32.310 回答