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

本指南將說明 Android TV 無障礙功能的最佳做法,並提供原生和非原生應用程式的最佳做法建議。

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

電視觀眾中,視障人士並不少見。根據世界衛生組織 (WHO) 的資料,全球約有 22 億人有視力障礙。根據 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() 查詢使用者的偏好設定。

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