背景:什么问题
我的应用程序有一个单词的首字母缩写词,让我们假设它是
ABC
当我使用谷歌的语音服务时,它会读出字母,这很棒
但是,当我使用三星语音 (S Voice) 时,它读出来的是 1 个单词,这不是很好!
那么为什么不直接设置内容描述呢?
ABC 出现在很多地方,设置替代内容描述是不可行的。此外,它可能会破坏其他语音服务的内容描述,这些服务可以像谷歌一样正确读出
我的计划
所以前段时间我遇到了一个问题,我发现了这个很棒的方法
对于扩展
ViewGroup
的类这是onRequestSendAccessibilityEvent
.综上所述,这个方法可以让你捕捉到
AccessibilityEvent
在处理之前以某种方式对其进行修改。除其他事项外,您可以获取要读出的内容描述并对其进行修改。我的想法是获取当前正在使用的 TTS 或 TalkBack 服务引擎,并使用正则表达式编辑字母 ABC 的内容描述,如果是三星语音 (S Voice),则将其设为 A B C。希望!
我的问题
任何人都知道获取
AccessibilityEvent
的监听器或回调在全局或通用情况下处理?onRequestSendAccessibilityEvent
仅适用于 ViewGroup
.我找不到 Activity
的替代品.任何人都知道如何捕获所有传入的
AccessibilityEvent
或者也许是我的问题的替代解决方案谢谢阅读!
最佳答案
没有可访问性事件/代表不适用于 Activity ,他们也不需要。每Activity
应该有一个作为 ViewGroup
实例的根/内容 View .这对我来说很好地过滤了 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"
例如,在另一种情况下,人们可能会将这种行为视为一种“特征”,例如:
"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);
现在将字符串本地化添加到等式中,嗯……这确实是一个非常复杂的问题。也许只是不理会事情是最好的选择。
关于Android TalkBack : Is there a Listener to catch all Accessibility Events?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44270029/