本指南提供了有关 Android TV 上无障碍功能的最佳实践,并针对原生应用和非原生应用提供了建议。
无障碍功能对我的电视应用为何如此重要?
电视观众中存在视力障碍的情况并不少见。世界卫生组织估计,全球有 22 亿人患有视力障碍,而美国约有 3, 200 万成年人出现严重视力丧失(2018 年美国全国健康访问调查)。在欧洲,EBU 估计有 3, 000 万人受到影响。
视力障碍用户与视力正常的同龄人一样喜欢媒体内容。Comcast 在 2017 年进行的一项调查发现,96% 的人会观看电视(81% 的人每天观看超过 1 小时)。但 65% 的用户表示在查找内容时遇到问题。此外,在英国的一项调查中,80% 的残障人士表示遇到了流式传输问题。
辅助技术有所帮助,但电视应用必须支持内容发现方面的无障碍功能。请特别注意导航指引和元素标签。 确保与 TalkBack 等功能兼容,从而显著改善视障用户的体验。
提高无障碍功能的第一步是提高意识。本指南可帮助您和您的团队发现电视应用中的无障碍问题。
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);
}