Android TalkBack:是否有侦听器来捕获所有辅助功能事件?

Android TalkBack: Is there a Listener to catch all Accessibility Events?

背景:问题是什么

我的应用程序有这个词的首字母缩写词让我们假设它是

ABC

当我使用 Google 的语音服务时,它会读出很棒的字母

但是当我使用 Samsung Voice (S Voice) 时,它读出的是 1 个单词,这不是很好!

为什么不直接设置内容描述呢?

ABC出现在很多地方,设置替代内容描述是不可行的。它还可能会破坏其他语音服务的内容描述,如 Google 的一个

我的计划

所以我前一段时间遇到了一个问题,我发现了这个好方法 类 扩展了 ViewGroup,即 onRequestSendAccessibilityEvent。 综上所述,此方法允许您在处理之前捕获一个 AccessibilityEvent 以某种方式对其进行修改。另外可以抓取要读出的内容描述修改。

我的想法是获取当前正在使用的 TTS 或 TalkBack 服务引擎,并使用正则表达式编辑字母 ABC 的内容描述,如果是三星语音(S 语音),则将其设为 A B C。希望!

我的问题

有谁知道在全局或通用情况下处理 AccessibilityEvent 的侦听器或回调? onRequestSendAccessibilityEvent 仅适用于 ViewGroup。我找不到 Activity.

的替代方案

任何人都知道如何捕获所有传入的 AccessibilityEvent 或者可能是我的问题的替代解决方案

感谢阅读!

无辅助功能events/delegates 不适用于活动,也不需要。每个 Activity 都应该有一个 root/content 视图,它是 ViewGroup 的一个实例。这对我来说非常有效,可以过滤 activity:

中的所有可访问性事件
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    View contentView = findViewById(android.R.id.content);

    contentView.setAccessibilityDelegate(new View.AccessibilityDelegate(){
        @Override
        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
            Log.wtf("Event: " + event.toString());
            return super.onRequestSendAccessibilityEvent(host, child, event);
        }

    });

}

我还要指出,TalkBack 支持按字符导航的能力,并且这样的解决方案可能正在解决 TalkBack 用户不认为是问题的问题。事实上,在某些情况下,这可能被视为更糟。任何时候你要改变残障人士看到的内容与实际内容相比,你都必须非常小心。尽管公告更清晰:

"ABC" != "A B C"

例如,在另一种情况下,人们可能会将此行为视为 "feature",例如:

"NASA" 

一个天真的实现可能是 "toLowerCase" 所有内容描述或在所有大写字母之间添加 space。显然,这些解决方案中的每一个都会产生不同类型的问题。

我的观点是,如果屏幕上的内容让用户感到困惑,TalkBack 可以让用户按字符导航。各种平台的AT用户都会习惯他们平台的"quarks"。通过使用上述解决方案之一,您已将不同的夸克强加给它们。有时,最可行的解决方案是让 "ABC" == "ABC",并允许 AT 用户自己解决问题。

如果您不打算以 "ideal" 的方式特别麻烦地修复所有字符串,最好不要管它。不过,最好的情况是正确考虑这两个问题,以及哪种解决方案最适用于给定的情况。

一些我更喜欢用内容描述覆盖的例子,这些例子可能会被正则表达式或字符串匹配捕获。一个很好的实现是发现这些特定场景,并通过 REGEX -> String dictionary with "replace" 修复它们到文本或内容描述 属性,并将其设置为新的内容描述。

"OFF" -> "off" //This one is super dumb on Google's part. "OFF" shows up on every switch in the OS!
"ON" -> "on" //See above comment.
"NASA" -> "nasa"
etc.

请注意,在我的字典中,我总是倾向于单词而不是单个字符声明:)。这样做的原因是,我没有改变字符串的性质。或者更确切地说,在每种情况下,以下都是正确的:

oldString.equalsIgnoreCase(newString);

现在将字符串本地化添加到等式中,嗯...这确实是一个非常复杂的问题。也许放任不管是最好的选择。

您也可以使用 ViewCompat 委托。事实上,上述解决方案对我不起作用。

ViewCompat.setAccessibilityDelegate(contentView, object : AccessibilityDelegateCompat() {
     override fun onInitializeAccessibilityNodeInfo(v: View, info: AccessibilityNodeInfoCompat) {
             super.onInitializeAccessibilityNodeInfo(v, info)
             Log.d("zcz", "sdfsdf")
      }
})