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

本指南介绍了 Android TV 上的无障碍功能的最佳实践, 原生应用和非原生应用的相关建议

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

观看电视的人群有视力障碍并不罕见。 据估计,全球有 22 亿人 有视力障碍, 世界卫生组织 (WHO) 发布。在美国,有 3200 万年满 18 周岁的美国人经历过 严重失明 数据来源:2018 年全国健康访谈调查。 在欧洲, 指向 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);
}