适用于 Android TV 的无障碍功能最佳实践

本指南介绍了 Android TV 上无障碍功能的最佳实践,并针对原生应用和非原生应用提供了建议。

为什么无障碍功能对我的 TV 应用至关重要?

在电视观看人群中,视觉障碍并不罕见。 根据世界卫生组织 (WHO) 的估计,全球有 22 亿人存在视力障碍。根据 2018 年全国健康访谈调查的数据,在美国,有 3200 万名年满 18 周岁的美国人经历了严重的视力丧失。 根据欧洲盲人联合会 (EBU) 的估算,欧洲有 3,000 万盲人和弱视人士。

最重要的是,有视力障碍的用户和视力正常的同龄人一样,可以欣赏媒体内容。Comcast 委托进行的2017 年调查显示,96% 的盲人或视力不佳的用户会定期观看电视,其中 81% 的用户每天观看电视的时间超过 1 小时。不过,65% 的受访者也表示在查找电视节目时遇到了问题。2020 年在英国开展的一项调查显示,80% 的残障人士表示,他们在使用视频点播在线媒体服务时遇到过无障碍问题。

虽然辅助技术可以帮助弱视用户,但在 TV 应用的内容发现历程中提供无障碍功能同样很重要。例如,请特别注意提供导航指南和正确标记元素,并确保 TV 应用能够与 TalkBack 等无障碍功能良好配合使用。这些步骤可以显著改善视障用户的体验。

提高无障碍功能的第一步是提高认识。本指南可帮助您和您的团队发现 TV 应用的无障碍功能问题。

Android 无障碍功能资源

如需详细了解 Android 上的无障碍功能,请参阅我们的无障碍功能开发资源

文字缩放

Android TV 应用应支持不同的像素密度,以遵循用户对文本放大的偏好设置。

请特别注意以下事项:

  • 在界面组件中使用 wrap_content 作为尺寸。
  • 确保在组件尺寸随文本缩放而变化时,布局重新排列组件。
  • 确保组件在较大的文本缩放比例下仍能显示在屏幕上。
  • 请勿对不灵活的组件使用 sp 文本大小单位。
  • 检查自定义视图中调整项的 FONT_SCALE 值:

    // Checking font scale with Context
    val scale = resources.configuration.fontScale
    Log.d(TAG, "Text scale is: " + scale)
    

您可以使用以下命令更改文本比例:

adb shell settings put system font_scale 1.2f

在 Android 12 及更高版本中,用户可以通过设备设置更改文本放大比例。

键盘布局

在 Android 13(API 级别 33)及更高版本中,您可以使用 getKeyCodeForKeyLocation() 查找键码,以获取预期的密钥位置。如果用户重新映射了某些按键位置,或者使用的是布局不常规的键盘,则可能需要这样做。

语音描述

在 Android 13(API 级别 33)及更高版本中,新的系统级无障碍偏好设置可让用户跨所有应用启用音频说明。Android TV 应用可以通过使用 isAudioDescriptionRequested() 查询用户的偏好设置来检查用户的偏好设置。

Kotlin

private lateinit var accessibilityManager: AccessibilityManager

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager::class.java)

// Where your media player is initialized
if (am.isAudioDescriptionRequested) {
    // User has requested to enable audio descriptions
}

Java

private AccessibilityManager accessibilityManager;

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager.class);

// Where your media player is initialized
if(accessibilityManager.isAudioDescriptionRequested()) {
    // User has requested to enable audio descriptions
}

Android TV 应用可以通过向 AccessibilityManager 添加监听器来监控用户偏好设置的更改时间:

Kotlin

private val listener =
    AccessibilityManager.AudioDescriptionRequestedChangeListener { enabled ->
        // Preference changed; reflect its state in your media player
    }

override fun onStart() {
    super.onStart()

    accessibilityManager.addAudioDescriptionRequestedChangeListener(mainExecutor, listener)
}

override fun onStop() {
    super.onStop()

    accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener)
}

Java

private AccessibilityManager.AudioDescriptionRequestedChangeListener listener = enabled -> {
    // Preference changed; reflect its state in your media player
};

@Override
protected void onStart() {
    super.onStart();

    accessibilityManager.addAudioDescriptionRequestedChangeListener(getMainExecutor(), listener);
}

@Override
protected void onStop() {
    super.onStop();

    accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener);
}