Android TV 的無障礙功能最佳做法

本指南介紹 Android TV 無障礙功能的最佳做法,並 原生及非原生應用程式的推薦機制

為什麼無障礙設計對電視應用程式很重要?

視力障礙的情況在看電視的族群中並不常見。 全球預估 22 億人 視障者 加入世界衛生組織 (WHO)根據 2018 年全國健康訪問調查,在美國,有 3,200 萬年滿 18 歲的美國人曾經歷嚴重的視力損失。根據歐洲盲人聯盟 (EBU) 的估計,歐洲地區有 3,000 萬名視障人士。

最重要的是,視障使用者喜歡媒體內容 就和看完整部影片一樣根據 Comcast 委託進行的2017 年調查,96% 的視障或低視力使用者會定期觀看電視,其中 81% 的人每天觀看電視超過 1 小時。不過,剩下 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()

KotlinJava
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
}
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,以監控使用者的偏好設定變更情形:

KotlinJava
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)
}
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);
}