Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有办法让对讲机说话吗?_Android_Accessibility_Talkback - Fatal编程技术网

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()
      管理资源将您与每个文档的
      活动的生命周期联系起来
    • ,这似乎是一种调用
      shutdown()
      以释放TTS资源的糟糕机制
一个更简单、更易于维护的解决方案是很好地使用对讲,并利用可访问性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)
                        }
                }
        }
    }
}

从任何需要的地方调用上面的方法(我在我的基本活动中添加了一个转发给助手的方法)。这将把公告插入到对讲消息队列中,以便大声宣布,并且不需要处理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);
}