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

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

為什麼無障礙功能對我的 TV 應用程式很重要?

在電視觀眾中,視力障礙者並不少見。 世界衛生組織 (WHO) 估計,全球約有 22 億人有視力障礙。根據 2018 年全國健康訪問調查,美國有 3,200 萬名年滿 18 歲的民眾有嚴重視力障礙。根據歐洲盲人聯盟 (EBU) 的估計,歐洲有 3,000 萬名盲人和弱視者。

最重要的是,視障使用者也能像視力正常的使用者一樣,盡情享受媒體內容。根據 Comcast 於 2017 年委託進行的調查,96% 的視障使用者會定期觀看電視,其中 81% 的人每天觀看時間超過一小時。不過,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);
}