本指南提供 Android TV 無障礙功能的最佳做法,並提供原生和非原生應用程式的建議。
為什麼無障礙功能對我的 TV 應用程式如此重要?
視力障礙在觀看電視人口中的情況並不常見。 世界衛生組織 (WHO) 指出,全球估計有 22 億人患有視力障礙。2018 年國家健康專訪問卷調查的指出,在美國,有 3,200 萬名年滿 18 歲的美國人遭受嚴重的視力損失。根據歐洲盲人聯盟 (EBU) 的資料,歐洲地區的估計值約為 3,000 萬名失明和部分視障人士。
最重要的是,視障使用者觀看媒體內容時, 和受完整視障者相同。根據 Comcast 委託,在 2017 年進行的問卷調查顯示,96% 失明或低視能的使用者中,有 81% 每天都觀看超過一小時的電視。不過,65% 的受訪者回報他們查詢電視內容時遇到問題另外,在 2020 年的英國問卷調查中,80% 的身心障礙使用者表示自己在使用隨選影片串流服務時遇到無障礙功能問題。
雖然輔助技術確實能夠協助低視能的使用者,但在 TV 應用程式的內容探索歷程中,也應支援無障礙功能。舉例來說,請特別留意提供導覽指南和為元素加上適當標籤,並確保 TV 應用程式可與 TalkBack 等無障礙功能正常搭配使用。這些步驟可大幅改善視障使用者的使用體驗。
想改善無障礙設計,第一步就是建立知名度。本指南可協助您和團隊找出 TV 應用程式的無障礙功能問題。
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); }