本指南提供了 Android TV 上无障碍的最佳实践,并针对原生和非原生应用提供了建议。
为什么无障碍对我的电视应用很重要?
视力障碍在电视观看人群中并不少见。根据世界卫生组织 (WHO) 的数据,全球估计有 22 亿人 患有视力障碍。根据 2018 年全国健康访谈调查,在美国,有 3200 万 18 岁及以上美国人经历了严重的视力下降。根据欧洲盲人联合会 (EBU) 的数据,在欧洲,估计有 3000 万 名盲人和弱视人士。
最重要的是,视力障碍的用户与视力正常的用户一样享受媒体内容。康卡斯特委托进行的 2017 年一项调查 显示,96% 的盲人或低视力用户定期观看电视,其中 81% 的人每天观看超过一小时。然而,65% 的人还报告在查找电视节目时遇到问题。在 英国 2020 年的一项调查 中,80% 的残疾人表示他们在点播视频流媒体服务中遇到过无障碍问题。
虽然辅助技术可以帮助低视力用户,但在电视应用的内容发现旅程中支持无障碍功能仍然很重要。例如,特别注意提供导航指南和正确标记元素,并确保电视应用能够很好地与 TalkBack 等无障碍功能协同工作。这些步骤可以显著改善视力障碍用户的体验。
提升无障碍体验的第一步是提高意识。本指南可以帮助你和你的团队发现电视应用中的无障碍问题。
Android 无障碍资源
要了解有关 Android 上无障碍功能的更多信息,请参阅我们的 无障碍开发资源。
文本缩放
Android TV 应用应尊重用户对文本缩放的偏好,方法是 支持不同的像素密度。
特别注意以下事项:
- 在 UI 组件的尺寸中使用
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); }