本指南提供了 Android TV 无障碍功能的最佳实践,并为原生应用和非原生应用提供了建议。
为什么无障碍功能对我的 TV 应用很重要?
在观看电视的人群中,视力障碍并不少见。据世界卫生组织 (WHO) 估计,全球约有 22 亿人患有视力障碍。在美国,根据 2018 年全国健康访谈调查,有 3200 万 18 岁及以上美国人经历了严重的视力丧失。在欧洲,根据欧洲盲人联盟 (EBU) 的估计,有 3000 万盲人和部分视力障碍者。
最重要的是,视力障碍用户和视力健全用户一样喜欢媒体内容。康卡斯特委托进行的一项 2017 年调查显示,96% 的盲人或低视力用户经常看电视,其中 81% 的人每天观看超过一小时。然而,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 level 33) 及更高版本中,您可以使用 getKeyCodeForKeyLocation()
来查找预期键位置的键码。如果用户重新映射了某些键位置,或者他们正在使用没有典型布局的键盘,这可能是必要的。
音频说明
在 Android 13 (API level 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); }