当前位置: 首页 > 知识库问答 >
问题:

Android TalkBack:是否有一个侦听器来捕获所有可访问事件?

宦翔飞
2023-03-14

背景:问题是什么

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

字母表

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

然而,当我使用三星语音(S Voice)时,它读出的是一个词,这不是很好!

那么为什么不只是设置内容描述呢?

ABC出现在许多地方,设置替代内容描述是不可行的。此外,它还可以破解其他语音服务的内容描述,如谷歌的内容描述

我的计划

所以我不久前遇到了一个问题,我发现了这个扩展ViewGroup的类的好方法,它是onRequest estSendAccessibilityEvent。总而言之,此方法允许您捕获AccessibilityEvent以在处理之前以某种方式对其进行修改。除其他外,您可以获取要读出的内容描述并对其进行修改。

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

我的问题

任何人都知道一个侦听器或回调来获取要在全局或通用情况下处理的AccessibilityEventonRequest estSendAccessibilityEvent仅适用于ViewGroup。我找不到Active的替代方案。

任何人都知道如何捕获所有传入的<code>AccessibilityEvent

感谢阅读!

共有2个答案

卞云瀚
2023-03-14

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

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

“无辅助功能”事件/委托不适用于“活动”,也不需要。每个活动都应该有一个根/内容视图,该视图是 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用户自己解决问题。

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

有些时候,我喜欢用内容描述覆盖,这可能会被正则表达式或字符串匹配捕捉到。一个很好的实现是发现这些特定的场景并通过正则表达式修复它们

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

请注意,在我的字典中,我总是朝向单词而不是单个字符公告:)。原因是,我没有改变字符串的性质。或者更确切地说,在每个inance中,以下都是正确的:

oldString.equalsIgnoreCase(newString);

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

 类似资料:
  • 问题内容: 任何Throwable都可以被捕获 输出: 因此,如果在初始化块期间做不好的事情,我希望能够捕获ExceptionInInitializerError。但是,以下操作无效: 输出: 并且如果我更改代码以另外捕获ArrayIndexOutOfBoundsException 被捕获的是ArrayIndexOutOfBoundsException: 谁能告诉我为什么呢? 问题答案: 顾名思义

  • 问题内容: 本质上,我希望更改内容时执行脚本。由于脚本是分开的(Chrome扩展程序和网页脚本中的内容脚本),因此我需要一种方法来简单地观察DOM状态的变化。我可以设置轮询,但这似乎草率。 问题答案: 长期以来,DOM3突变事件是最佳的可用解决方案,但由于性能原因,不建议使用它们。DOM4突变观察者代替了不推荐使用的DOM3突变事件。目前,它们在现代浏览器中的实现方式为(或在旧版Chrome中由供

  • 问题内容: 我想删除使用添加的所有特定类型的事件监听器。我看到的所有资源都在说您需要执行以下操作: 但是我希望能够在不知道当前状态的情况下清除它,如下所示: 问题答案: 如果不拦截呼叫并跟踪侦听器,或者使用不幸的是允许使用此类功能的库,那么这是不可能的。 您可以做的最接近的事情是通过克隆元素来删除所有侦听器,这不会克隆侦听器集合。 注意:这还将删除元素子级上的侦听器。

  • 一旦中的所有元素都为真,我想隐藏。为此,我使用。现在立即消失,似乎无需等待所有true。这是我的代码。 左抽屉指针: RestModel: 怎么解决?

  • 问题内容: 你好 我想获得在运行时在Java中实现接口的类的列表,这样我就可以进行查找服务而不必对其进行硬编码。有没有简单的方法可以做到这一点?我不害怕 问题答案: 最简洁的答案是不。 长的答案是,子类可以以多种方式出现,从根本上说,根本不可能分类找到它们。 您无法在运行时执行此操作,但只有在加载了类以及如何知道它们已加载后才能找到类?您可以扫描每个JAR和类文件,但这不是确定的。另外,还有URL

  • 这个问题不是关于Rollbar tho:)