我当时是在RK3568的开发板上跑一个基于React Native的无障碍需求,页面逻辑其实很简单,但打开TalkBack之后,整个界面的焦点顺序乱成一锅粥,屏幕阅读器把不该读的装饰性图片读了出来,真正该读的动态内容却鸦雀无声。排查到最后,问题集中在一个平时几乎没人注意的API上:AccessibilityInfo。在OpenHarmony上做React Native无障碍,这个API既是入口,也是最容易翻车的地方。这篇文章就从我在真机上踩过的这些坑说起,把AccessibilityInfo的调用链路、与系统无障碍服务之间的协作逻辑、以及在OpenHarmony设备上测试时那些文档里不会写的细节,一次说清楚。
1. OpenHarmony上的React Native无障�碍:先搞清楚这套组合拳是怎么出的
1.1 为什么要在OpenHarmony上多绕一层React Native
现在做OpenHarmony应用,常见的路线无非两种:直接用ArkTS写原生页面,或者用跨平台框架补齐性能。React Native for OpenHarmony(社区通常叫RNOH)的价值在于,当前端团队的存量逻辑大部分是React Native的,迁移到OpenHarmony时不需要从零实现业务代码,只需要适配底层的桥接层。
这个思路在无障碍这件事上尤其有吸引力。无障碍是系统级能力,牵涉屏幕阅读器、焦点管理、键鼠导航、手势替代等一整套机制,原生代码想做好都费劲,更不用说跨平台层还得把JS侧的语义信息完整地暴露给系统。RNOH在这块还处在快速补齐阶段,AccessibilityInfo正是这套桥接中通向系统无障碍服务的核心窗口。比如TalkBack想朗读一个按钮的文字,系统那边需要先知道这个组件的可访问性角色和标签,而这个信息必须经由RNOH的辅助功能模块转发,最终落到系统无障碍框架里。换言之,不管你前端业务层怎么写,只要在OpenHarmony上跑RN页面,无障碍信息链路的起点就是AccessibilityInfo和相关属性。
所以这篇文章不会只讲API怎么调用,而是要回答几个更加实在的问题:RNOH如何把组件语义映射到OpenHarmony的无障碍框架、TalkBack在什么情况下会漏读或乱读、AccessibilityInfo事件回调在真机上能否做到实时、用RK系列开发板做设备选型时怎么处理设备树差异。这些都是我在项目排期里被狠狠练过的东西。
1.2 无障碍不是读屏软件一个人的事
我在很多技术群里看到一种误解,以为无障碍功能等于把系统TalkBack打开就行。实际体验下来,无障碍更像一整套分层协作机制:
- 系统无障碍服务:负责接收来自应用的无障碍事件,结合节点树,通过语音或震动向用户反馈界面信息。
- 语义节点树:系统会为当前界面生成一颗可访问性树,一个按钮、一个输入框就是树上的节点。此树是否完整、节点顺序是否合理,直接决定了TalkBack能不能把信息读对。
- 焦点管理:用户通过滑动或快捷键移动焦点,焦点落在某个节点上,系统才会朗读该节点的内容。
- 应用侧设置:应用需要为组件提供准确的accessibilityLabel、accessibilityRole、accessibilityState等语义,否则系统无从知道这个节点是什么、处于什么状态。
React Native在原生平台上的工作方式,是RN框架在UI原生视图层挂载时,同步为每个视图构建对应的辅助功能节点信息。RNOH在OpenHarmony上走的也是类似路径。AccessibilityInfo在其中扮演的角色,更像是应用与系统机制之间的一个事件总线和状态汇报器,它既能读取屏幕阅读器是否开启,也能发送自定义事件让系统立即播报某段文本。
理解这层关系之后,再看很多无障碍bug就会清晰很多。比如焦点顺序错乱,不是AccessibilityInfo一个API的锅,而是应用没有指定accessible和accessibilityOrder;再比如页面变化后TalkBack没有及时通知用户,那很可能是没有调用accessibilityAnnouncement或对应的事件通知。千万别把AccessibilityInfo当作一个单纯的开关状态查询工具,它的核心价值是让应用具备“主动与无障碍服务沟通”的能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从开发板到可调试环境:RK3568设备树选型和白屏问题
2.1 设备树到底怎么选:先认芯片、再认板卡、最后认外设
在OpenHarmony开发板圈子里,RK3568和RK3588是两款出现频率极高的芯片,自媒体和培训视频也多,搜索“openharmony rk3568的许多设备树到底咋选”的人一抓一大把。我自己最初拿到的是一块市面上常见的RK3568开发板,烧录官方镜像后发现触摸屏翻转、以太网口不通,原因就是内核加载的设备树跟实际板卡型号不匹配。
选设备树的核心逻辑是这样三步:
- 确认主控芯片是RK3566、RK3568还是RK3588。它们的引脚定义和外设控制器存在差异,设备树不能互相套用。
- 确认板卡的具体型号和版本。同一颗RK3568,不同厂商的底板布局不一样,LCD屏幕的使能GPIO、I2C通路都不同,所以设备树通常是厂商SDK里以“芯片+板级型号”的规则命名的。
- 确认你的外设。系统烧录时加载的设备树决定哪些设备被注册,比如你要用USB Host接键鼠,就要确保设备树里开启了对应的EHCI/OHCI或DWC3控制器节点。
我用的方案是直接在u-Boot启动阶段通过env中的fdtfile参数来指定设备树文件。我手头这块板子在RK3568的BSP里对应的是rk3568-evb1-ddr4-v10.dtb,但网上很多教程默认给的是rk3568-evb.dtb,差了后面几个字符,行为就完全不同。建议拿到板子先把官方SDK目录下`kernel-5.10/arch/arm64/boot/dts/rockchip
