7

背景:问题是什么

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

美国广播公司

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

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

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

ABC 出现在很多地方,设置替代内容描述是不可行的。此外,它可能会破坏其他语音服务的内容描述,这些服务可以像谷歌一样正确读出

我的计划

所以前段时间我遇到了一个问题,我发现了这个扩展类的好ViewGroup方法onRequestSendAccessibilityEvent。综上所述,这个方法可以让你AccessibilityEvent在处理之前捕捉到以某种方式修改它。除其他事项外,您可以获取要读出的内容描述并对其进行修改。

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

我的问题

任何人都知道侦听器或回调以AccessibilityEvent在全局或通用情况下进行处理? onRequestSendAccessibilityEvent只为ViewGroup。我找不到Activity.

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

谢谢阅读!

4

2 回答 2

5

没有可访问性事件/代表不适用于活动,他们也不需要。每个都Activity应该有一个根/内容视图,它是ViewGroup. 这对我来说很好地过滤了活动中的所有可访问性事件:

@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"

例如,在另一种情况下,人们可能会将这种行为视为一种“特征”,例如:

"NASA" 

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

我的观点是,如果屏幕上的内容让用户感到困惑,TalkBack 让用户能够按字符导航。各种平台的 AT 用户将习惯于他们平台的“夸克”。通过使用上述解决方案之一,您可以强制它们使用不同的夸克。有时,最容易获得的解决方案就是"ABC" == "ABC"让 AT 用户自己解决问题。

如果您不打算专门以“理想”方式修复所有字符串,那么最好不要管它。不过,最好的情况是正确考虑这两个问题以及在给定情况下哪种解决方案最适用。

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

"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);

现在将字符串本地化添加到等式中,嗯……这确实是一个非常复杂的问题。也许只是不理会事情是最好的选择。

于 2017-05-31T20:18:50.513 回答
1

You can use ViewCompat delegate as well. In fact, the above solution did not work for me.

ViewCompat.setAccessibilityDelegate(contentView, object : AccessibilityDelegateCompat() {
     override fun onInitializeAccessibilityNodeInfo(v: View, info: AccessibilityNodeInfoCompat) {
             super.onInitializeAccessibilityNodeInfo(v, info)
             Log.d("zcz", "sdfsdf")
      }
})
于 2021-07-23T02:13:44.113 回答