测试应用的无障碍功能

通过测试无障碍功能,您可以从用户的角度体验您的应用,并发现原本可能忽略的易用性问题。无障碍功能测试可以挖掘出改进机会,使您的应用变得功能更强大且更多样,造福于所有用户,包括残障用户。

为了获得最佳效果,请使用本文档中介绍的所有方法:

  • 手动测试:使用 Android 无障碍服务与您的应用互动。
  • 使用分析工具进行测试:使用各种工具发现改进应用无障碍功能的机会。
  • 自动化测试:在 Espresso 和 Robolectric 中开启无障碍功能测试。
  • 用户测试:从与您的应用互动的用户那里获得反馈。

手动测试

手动测试能让您从用户的角度体验应用。Android AccessibilityService 对象会改变应用内容呈现给用户的方式以及用户与内容互动的方式。通过使用无障碍服务与您的应用互动,您可以像用户一样体验应用。

TalkBack

TalkBack 是 Android 的内置屏幕阅读器。开启 TalkBack 后,用户无需查看屏幕即可与 Android 设备互动。视障用户在使用您的应用时可能需要依赖于 TalkBack。

开启 TalkBack

  1. 打开设备的“设置”应用。
  2. 转到无障碍,然后选择 TalkBack
  3. 在 TalkBack 屏幕的顶部,按开启/关闭即可开启 TalkBack。
  4. 在确认对话框中,选择确定以确认权限。

使用 TalkBack 浏览应用

开启 TalkBack 后,您可以通过以下两种常见方式导航:

  • 线性导航:快速向左或向右滑动即可按顺序浏览屏幕元素。点按任意位置两次即可选择当前屏幕元素。
  • 点按浏览:在屏幕上拖动手指即可让系统读出手指轻触的内容。点按任意位置两次即可选择当前元素。

如需使用 TalkBack 浏览应用,请完成以下步骤:

  1. 打开您的应用。
  2. 按顺序滑动浏览各个元素。
  3. 在浏览过程中,注意下面几个问题:

    • 每个元素的语音反馈是否恰当地传达了其内容或用途?了解如何编写有意义的标签。* 朗读内容是简洁明了,还是过于冗长?
    • 您能否轻松完成主要工作流程?
    • 您能否通过滑动浏览每个元素?
    • 如果出现提醒或其他临时消息,TalkBack 能否朗读出来?

如需了解详情和提示,请参阅 TalkBack 用户文档 .

可选:TalkBack 开发者设置

TalkBack 开发者设置可让您轻松使用 TalkBack 测试应用。

如需查看或更改开发者设置,请完成以下步骤:

  1. 打开设备的“设置”应用。
  2. 转到无障碍,然后选择 TalkBack
  3. 依次选择设置 > 高级设置 > 开发者设置

    1. 日志输出级别:选择详细
    2. 显示语音输出:开启此设置即可在屏幕上查看 TalkBack 语音输出。

开关控制

“开关控制”可让用户使用开关(而不是触摸屏)与 Android 设备互动。开关分为以下几种:AbleNet、Enabling Devices、RJ Cooper 或 Tecla* 等出售的辅助技术设备;外部键盘按键;或者按钮。对于有运动障碍的用户,此服务非常有用。

* Google 不对这些公司或他们的产品给予认可。

开启“开关控制”

配置“开关控制”的一种方式是使用两个开关。一个开关被指定为“下一项”开关,用于在屏幕上移动焦点;第二个是“选择”开关,用于选择焦点所在的元素。如需使用这种双开关方法,您可以使用任意一对硬件按键。

在设置“开关控制”时,如需将音量调低键用作“下一项”开关,并将音量调高键用作“选择”开关,请完成以下步骤:

  1. 确保 TalkBack 已关闭。
  2. 打开设备的“设置”应用。
  3. 转到无障碍并选择开关控制,然后选择设置
  4. 在“开关控制偏好设置”屏幕中,确保自动扫描功能已关闭。
  5. 将音量调低键用作“下一项”开关:

    1. 依次点按指定扫描按键 > 下一项
    2. 对话框打开后,按音量调低键。此时,对话框会显示 KEYCODE_VOLUME_DOWN。
    3. 点按确定,确认并退出该对话框。
  6. 将音量调高键用作“选择”开关:

    1. 点按“选择”。
    2. 对话框打开后,按音量调高键。此时,对话框会显示 KEYCODE_VOLUME_UP。
    3. 点按确定,确认并退出该对话框。
  7. 如需返回“开关控制偏好设置”,请点按返回按钮。

  8. 可选:如果您使用的是 TalkBack 5.1 或更高版本,则可以选择语音反馈来开启语音反馈。

  9. 如需返回“开关控制”主屏幕,请点按返回按钮。

  10. 在“开关控制”屏幕的顶部,按开启/关闭即可开启“开关控制”。

  11. 在确认对话框中,选择确定以确认权限。

通过“开关控制”浏览应用

如需通过“开关控制”浏览您的应用,请完成以下步骤:

  1. 打开您的应用。
  2. 按“下一项”键(音量调低按钮)开始扫描。
  3. 继续按“下一项”开关,直到找到您想要选择的项。
  4. 按“选择”键(音量调高按钮)选择突出显示的项。
  5. 在浏览过程中,注意下面几个问题:

    • 您能否轻松完成主要工作流程?
    • 如果存在文本或其他输入内容,您能否轻松添加和修改内容?
    • 这些项只有在您可以对它们执行操作时才会突出显示吗?
    • 每项是否只能突出显示一次?
    • 可通过触摸屏手势使用的所有功能是否也可作为“开关控制”中的可选控件或自定义操作使用?
    • 如果您使用的是 TalkBack 5.1 或更高版本,并且已开启语音反馈,那么每个元素的语音反馈是否恰当地传达了其内容或用途?了解如何编写有意义的标签

可选:通过组选择来查看所有可扫描项

组选择是一种“开关控制”导航方法,可让您同时查看所有的可扫描项。借助此选项,您可以快速检查屏幕上是否突出显示了正确的元素。

如需开启组选择,请完成以下步骤:

  1. 打开设备的“设置”应用。
  2. 转到无障碍并选择开关控制,然后选择设置
  3. 在“开关控制偏好设置”屏幕中,确保自动扫描功能已关闭。
  4. 依次选择扫描方法 > 组选择
  5. 点按指定用来控制扫描的开关
  6. 确保组选择开关 1组选择开关 2 下的文本表明已经为这两者各指定了一个开关。如果您按照本文档中的步骤开启“开关控制”,则应该已指定音量按钮。

如需通过组选择使用“开关控制”来浏览您的应用,请完成以下步骤:

  1. 按“选择”键(音量调高按钮)以突出显示当前屏幕上的所有可操作项。注意下面几个问题:

    • 是否仅突出显示了可操作项?
    • 是否突出显示所有可操作项?
    • 突出显示的项的密度是否合理?
  2. 转到其他屏幕以清除突出显示效果。

如需详细了解用户如何使用组选择进行导航,请参阅“开关控制”使用提示

Voice Access

Voice Access 可让用户通过语音指令控制 Android 设备。搭载 Android 5.0(API 级别 21)及更高版本的设备提供 Voice Access。如需使用 Voice Access 测试您的应用,请了解如何开始使用 Voice Access

使用分析工具进行测试

分析工具可以发现手动测试可能会错失的无障碍功能改进机会。

Compose 界面检查

在 Compose 预览上激活 Compose UI 检查模式,以便让 Android Studio 自动审核 Compose 界面是否存在无障碍功能问题。Android Studio 会在“问题”面板中突出显示问题(例如文本在大屏幕上拉伸或色彩对比度较低),以检查您的界面是否可在不同的屏幕尺寸下正常运行。

点击 Compose UI Check 模式按钮以激活检查。
已激活 Compose 界面检查模式,并在问题面板中显示详细信息。

无障碍功能扫描仪

无障碍功能扫描仪应用会扫描您的屏幕,并提出关于如何改进应用无障碍功能的建议。无障碍功能扫描仪使用无障碍功能测试框架,并在查看内容标签、可点击项、对比度等内容后提供具体建议。

Android Studio 中集成了 Android 无障碍功能测试框架,有助于查找布局中的无障碍功能问题。如需启动该工具的面板,请点击布局编辑器中的错误报告按钮 !

无障碍功能扫描仪演示 图 1. 无障碍功能扫描仪演示

如需了解详情,请参阅以下资源:

Google Play 上的发布前测试报告

如果您在 Google Play 上分发应用,便可查看应用的发布前测试报告。在您通过 Google Play 管理中心将应用上传到发布渠道不久后,Google Play 会生成此报告。发布前测试报告也可在 Google Play 管理中心内找到,它显示了 Google Play 对您的应用执行的测试的结果。

具体而言,Google Play 会使用无障碍功能测试框架运行无障碍功能测试。这些测试的结果将显示在应用发布前测试报告内无障碍标签页上的一个表格中。

该表格将改进机会分为以下几类:

触摸目标大小
应用中的某些互动元素的可聚焦区域(即触摸目标大小)小于建议的值。
低对比度
对某个文本元素和该元素后面的背景使用的一对颜色的色彩对比度低于建议的值。
内容标签
某些界面元素没有描述元素用途的标签
实现
为界面元素分配了某些属性,这使得系统的无障碍服务更难以正确解读元素。例如,为可修改的 View 标签定义说明,以及使用与元素的逻辑排列方式不匹配的元素遍历顺序

在该表格后面,发布前测试报告显示了应用的快照。这些快照呈现了各个类别中改进应用无障碍功能的首要机会。选择屏幕截图后,您可以查看更多详细信息,包括建议的改进和一个更完整的列表,其中列出了您可以在应用中的哪些位置应用同样的改进。

图 2 显示了一个表格的示例,它显示在 Google Play 中发布前测试报告的无障碍标签页上。此图还包含应用的一个快照,它显示了下一项按钮的触摸目标大小小于建议的值。

显示发布前测试报告“无障碍”标签页的图片
图 2. 发布前测试报告的无障碍标签页上的摘要表格(左)和屏幕截图(右)示例。

UI Automator 查看器

uiautomatorviewer 工具提供了一个方便的 GUI,可扫描和分析 Android 设备上当前显示的界面组件。您可以使用 UI Automator 检查布局层次结构,并查看在设备前台显示的界面组件的属性。利用此信息,您可以创建更精细的测试。例如,通过创建与特定可见属性匹配的界面选择器来做到这一点。该工具位于 Android SDK 的 tools 目录中。

在无障碍功能测试中,此工具对于调试使用其他测试方法发现的问题很有用。例如,如果手动测试揭示了某个视图应包含却未包含可朗读的文本,或者某个视图不应获得却获得了焦点,您可以使用该工具帮助找出问题根源。

如需详细了解 UI Automator 查看器,请参阅使用 UI Automator 编写自动化测试

lint

Android Studio 会显示有关各种无障碍功能问题的 lint 警告,并提供指向源代码中相关位置的链接。在以下示例中,一张图片缺少 contentDescription 属性。缺少内容说明会导致生成以下消息:

[Accessibility] Missing 'contentDescription' attribute on image

图 3 举例说明了此消息在 Android Studio 中是什么样子的:

显示 Android Studio 报告某些图片缺少内容说明的图片。
图 3. Android Studio 中显示缺少 contentDescription 属性的消息。

自动测试

Android 平台支持多个测试框架(例如 Espresso),每个框架都允许您创建并运行自动化测试,以评估应用的无障碍功能。

Espresso

Espresso 是一个 Android 测试库,旨在打造简单快捷的界面测试体验。它可让您与应用中的被测界面组件互动,并断言会发生某些行为或满足特定条件。

如需通过视频简要了解如何使用 Espresso 进行无障碍功能测试,请观看以下视频(从 31 分 54 秒到 34 分 19 秒):包容性设计和测试:让您的应用使用起来更没有障碍 - 2016 年 Google I/O 大会

本部分介绍如何使用 Espresso 运行无障碍功能检查。

启用检查

您可以使用 AccessibilityChecks 类启用和配置无障碍功能测试:

Kotlin

import androidx.test.espresso.accessibility.AccessibilityChecks

@RunWith(AndroidJUnit4::class)
@LargeTest
class MyWelcomeWorkflowIntegrationTest {
    init {
        AccessibilityChecks.enable()
    }
}

Java

import androidx.test.espresso.accessibility.AccessibilityChecks;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyWelcomeWorkflowIntegrationTest {
    @BeforeClass
    public void enableAccessibilityChecks() {
        AccessibilityChecks.enable();
    }
}

默认情况下,当您执行 ViewActions 中定义的任何视图操作时,系统都会运行检查。每次检查都包括执行操作所在的视图以及所有后代视图。您可以在每次检查期间评估屏幕的整个视图层次结构,方法是将 true 传入 setRunChecksFromRootView(),如以下代码段所示:

Kotlin

AccessibilityChecks.enable().setRunChecksFromRootView(true)

Java

AccessibilityChecks.enable().setRunChecksFromRootView(true);

抑制结果的子集

Espresso 针对应用运行无障碍功能检查后,您可能会发现一些有助于改进应用的无障碍功能,但无法马上进行处理的结果。为了防止 Espresso 测试因这些结果而不断失败,您可以暂时忽略它们。无障碍功能测试框架 (ATF) 使用 setSuppressingResultMatcher() 方法提供此功能,借此指示 Espresso 抑制满足给定匹配器表达式的所有结果。

如果您对应用所做的更改可以改进无障碍功能的一个方面,让 Espresso 尽可能多地显示无障碍功能其他方面的结果会有好处。因此,最好仅抑制已知的具体改进机会。

如果您暂时抑制无障碍功能测试的某些结果,打算以后再处理,切勿意外抑制类似的结果。因此,请使用作用域较小的匹配器。为此,选择的匹配器应确保只有在给定的结果满足以下每项无障碍功能检查的条件时,Espresso 才会抑制该结果:

  1. 某种类型的无障碍功能检查,如用于检查触摸目标大小的无障碍功能检查。
  2. 用于评估特定界面元素(如按钮)的无障碍功能检查。

ATF 定义了多个匹配器,以帮助您定义要在 Espresso 测试中显示的结果。以下示例会抑制与单个 TextView 元素的色彩对比度相关的检查结果。元素的 ID 为 countTV

Kotlin

AccessibilityChecks.enable().apply {
        setSuppressingResultMatcher(
                allOf(
                    matchesCheckNames(`is`("TextContrastViewCheck")),
                    matchesViews(withId(R.id.countTV))
                )
        )
}

Java

AccessibilityValidator myChecksValidator = AccessibilityChecks.enable();
Matcher<? super AccessibilityViewCheckResult> myChecksMatcher =
        Matchers.allOf(matchesCheckNames(is("TextContrastViewCheck")),
                       matchesViews(withId(R.id.countTV)));
myChecksValidator.setSuppressingResultMatcher(myChecksMatcher);

用户测试

与本指南中的其他测试方法一样,用户测试可以提供有关应用易用性的具体且宝贵的深入分析。

为了找到可以测试您的应用的用户,请使用如下方法:

  1. 与为残障人士提供培训的当地组织、学院或大学联系。
  2. 在您的社交圈中询问。可能会有残障人士愿意提供帮助。
  3. 询问用户测试服务机构(如 usertesting.com),看看他们能否邀请残障用户测试您的应用。
  4. 加入无障碍功能论坛(如 Accessible),邀请志愿者试用您的应用。

如需更多提示,请观看以下视频的用户测试部分(从 31 分 10 秒到 44 分 51 秒):幕后花絮:Android 无障碍功能的新变化 - 2016 年 Google I/O 大会