测试应用的无障碍功能

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

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

  • 手动测试:使用 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 不对这些公司或他们的产品给予认可。

开启“开关控制”

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

注意:您使用“开关控制”的体验会因所用的工具和软件而异:

  • 如果您使用外部开关(如键盘),还需要执行其他设置步骤。例如,您需要重新启用软键盘。如需了解详情,请参阅开关控制用户文档
  • 如果您使用的是 TalkBack 5.1 或更高版本,则可以使用设置向导配置“开关控制”。如需使用此向导(而不是执行以下步骤),请依次转到设置 > 无障碍 > 开关控制 > 设置 > 打开“开关控制”设置

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

  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. 转到其他屏幕以清除突出显示效果。

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

其他服务

Android 提供了一些其他工具来测试应用的无障碍功能。

盲文提示

Google 盲文提示是一款应用,可让用户通过蓝牙将可刷新的盲文显示屏连接到 Android 设备。“盲文提示”可与 TalkBack 配合使用,共同打造兼具语音和盲文的使用体验。

如需使用盲文显示屏测试您的应用,请了解如何安装并开启“盲文提示”

如需查看“盲文提示”呈现的盲文(和 ASCII 转换),而不连接盲文显示屏,您可以使用“盲文提示”设置中的叠加选项:

  1. 打开设备的“设置”应用。
  2. 转到无障碍,然后选择盲文提示
  3. 依次选择设置 > 开发者选项 > 在屏幕上显示盲文输出

Voice Access

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

分析工具

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

无障碍功能扫描仪

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

了解详情:

Google Play 上的发布前测试报告

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

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

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

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

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

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

发布前测试报告部分的屏幕截图
图 1. 发布前测试报告的无障碍标签页上的摘要表格(左)和屏幕截图(右)示例

UI Automator 查看器

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

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

如需详细了解 UI Automator 查看器,请参阅测试多个应用的界面

Lint

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

[Accessibility] Missing 'contentDescription' attribute on image

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

消息的屏幕截图
图 2. Android Studio 中显示缺少 contentDescription 属性的消息

如果屏幕阅读器等无障碍服务的用户在应用内遇到这张图片,他们将无法理解该图片的含义。

自动化测试

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

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

Espresso

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

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

启用检查

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

Kotlin

import androidx.test.espresso.contrib.AccessibilityChecks

@RunWith(AndroidJUnit4::class)
@LargeTest
class MyWelcomeWorkflowIntegrationTest {
    companion object {
        @Before @JvmStatic
        fun enableAccessibilityChecks() {
            AccessibilityChecks.enable()
        }
    }
}

Java

import androidx.test.espresso.contrib.AccessibilityChecks;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyWelcomeWorkflowIntegrationTest {
    @Before
    public static 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);

Robolectric

Robolectric 是一个开源 Android 测试库,可让您在 JVM 上测试真实的 Android 代码,而无需启动模拟器。了解如何开始使用 Robolectric

抑制已知问题

首次针对 Robolectric 启用检查时,您可能会遇到许多无法立即处理的问题。您可以为希望抑制的结果设置匹配器来抑制这些错误。如需了解详情,请参阅 Robolectric 中提供的 AccessibilityUtil 类的 setSuppressingResultMatcher() 方法的文档。

用户测试

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

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

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

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