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")
}
})
背景:问题是什么
我的应用程序有这个词的首字母缩写词让我们假设它是
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")
}
})