Xamarin Android能否实现不依赖UI控件的TalkBack无障碍播报?
原问题
在Xamarin iOS中,可在后台操作完成等场景触发VoiceOver播报,该播报不依赖任何UI控件的展示。
而在Xamarin Android中,无障碍开发者文档仅给出了针对特定UI控件触发TalkBack播报的示例。
我尝试通过代码创建简单UI控件ctl并调用ctl.AnnounceForAccessibility("My announcement")作为解决方案,但未听到任何播报,推测原因是该控件未加入视图树。
请问是否有方法可在Android上不借助(可见)UI控件触发TalkBack播报?
解决方案
核心实现逻辑
Android原生提供了AccessibilityManager全局服务,可以直接发送无障碍播报事件,不需要依赖任何附加到视图树的UI控件,完全满足无UI/后台场景的播报需求。
具体实现代码
using Android.AccessibilityServices; using Android.Views.Accessibility; // 传入当前Context即可,Activity/Application上下文都适用 public void TriggerTalkBackAnnounce(Context context, string announceContent) { // 获取系统无障碍服务管理器实例 var accessibilityManager = context.GetSystemService(Java.Lang.Class.FromType(typeof(AccessibilityManager))) as AccessibilityManager; // 无障碍服务未启用时直接返回,避免无效操作 if (accessibilityManager == null || !accessibilityManager.IsEnabled) { return; } // 构造无障碍播报事件 using var announcementEvent = AccessibilityEvent.Obtain(EventTypes.Announcement); announcementEvent.ClassName = nameof(View); announcementEvent.PackageName = context.PackageName; // 绑定需要播报的文本内容 announcementEvent.Text.Add(announceContent); /* 设置播报优先级: LiveRegionMode.Assertive:会打断当前TalkBack正在播报的内容,优先播报本次内容 LiveRegionMode.Polite:等待当前正在播报的内容结束后,再播报本次内容 */ announcementEvent.LiveRegion = LiveRegionMode.Assertive; // 提交事件到系统触发播报 accessibilityManager.SendAccessibilityEvent(announcementEvent); }
补充说明
- 你之前测试单独创建控件调用
AnnounceForAccessibility不生效的推测是正确的,Android原生要求调用该方法的控件必须已经附加到当前窗口的视图树,才会将播报事件提交给系统处理,未加入视图树的控件调用该方法不会触发任何播报。 - 本方案支持后台场景调用,只要应用没有被系统限制无障碍相关权限即可正常触发播报。
内容的提问来源于stack exchange,提问作者Anders Gustafsson
相关产品推荐
相关产品推荐

