HDMI-CEC 控制服務

高解析多媒體介面消費性電子產品控制 (HDMI-CEC) 標準可讓多媒體消費性產品彼此通訊及交換資訊。HDMI-CEC 支援許多功能,例如遙控器傳輸和系統音訊控制,但最受歡迎的功能之一是「一鍵播放」。有了「一鍵播放」功能,媒體來源裝置就能開啟電視並自動切換輸入埠,因此你不需要尋找電視遙控器,就能從 Chromecast 切換到 Blu-ray 播放器。

在 Android 12 中,HDMI 連接螢幕的電源控制功能與內部螢幕的電源控制功能一致。HDMI 播放裝置喚醒時,會嘗試透過 HDMI CEC One Touch Play 喚醒連線的電視,並成為目前的有效來源。如果裝置在目前為啟用來源時進入休眠狀態,就會嘗試關閉連線的電視。

支援 HDMI-CEC 通常是選用功能。不過,大多數製造商都已採用 HDMI-CEC,因此自家裝置可與其他公司的裝置搭配使用。各製造商導入 HDMI-CEC 標準的方式不同,因此裝置不一定能互相瞭解,支援的功能也會因裝置而異。因此,消費者無法安全地假設聲稱支援 CEC 的兩項產品完全相容。

如果傳送和接收裝置都支援 HDMI-CEC 2.0 版標準,即可提升 HDMI 裝置之間的相容性。

解決方案

Android TV 輸入架構 (TIF) 推出後,HDMI-CEC 可整合所有連線裝置,並盡量減少相容性問題。為解決這些痛點,Android 建立了名為 HdmiControlService 的系統服務。

Android 希望透過在 Android 生態系統中提供 HdmiControlService,達到以下目標:

  • 為所有製造商提供 HDMI-CEC 標準實作方式,減少裝置不相容的問題。先前,製造商必須自行開發 HDMI-CEC 實作項目,或使用第三方解決方案。
  • 這項服務已針對市面上眾多 HDMI-CEC 裝置進行充分測試。Android 針對產品間的相容性問題進行嚴格研究,並向經驗豐富的裝置實作人員收集實用建議。CEC 服務的設計宗旨,是在標準與標準修改之間維持適當平衡,確保能與使用者現有的產品搭配運作。

整體設計

HdmiControlService 會與系統的其餘部分 (例如 TV Input Framework (TIF)、音訊服務和電源服務) 連線,以實作標準指定的各種功能。

下圖顯示從自訂 CEC 控制器切換至較簡單的 HDMI-CEC 硬體抽象層 (HAL) 實作方式。

圖表:顯示 Android 5.0 前後的 HDMI-CEC 實作方式

圖 1. HDMI 控制服務更換

實作

如要詳細瞭解 HDMI 控制服務,請參閱下圖。

圖片:顯示 HDMI 控制服務詳細資料

圖 2. HDMI 控制項服務詳細資料

如要正確導入 Android HDMI-CEC,請務必使用下列主要成分:

  • 管理員類別 HdmiControlManager 會為具備權限的應用程式提供 API。電視輸入管理員服務和音訊服務等系統服務可以直接使用這項服務。
  • 這項服務的設計目的是允許代管多種邏輯裝置。
  • HDMI-CEC 會透過硬體抽象層 (HAL) 連接硬體,簡化裝置間通訊協定和信號機制差異的處理方式。裝置製造商可使用 HAL 定義實作 HAL 層。

注意:裝置製造商應將下列程式碼行新增至 device.mk 中的 PRODUCT_COPY_FILES

PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.hdmi.cec.xml:system/etc/permissions/android.hardware.hdmi.cec.xml

視裝置是 HDMI 接收器裝置或 HDMI 來源裝置而定,裝置製造商必須在 device.mk 中設定 ro.hdmi.device_typeHdmiControlService 才能正常運作。

如果是 HDMI 來源裝置,例如 Over the Top (OTT) 或機上盒 (STB) 裝置,請設定:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4

如果是 HDMI 接收器裝置 (例如電視面板),請設定:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0
  • 裝置製造商提供的專屬 CEC 控制器無法與 HdmiControlService 共存。必須停用或移除。這類常見需求來自於處理製造商專屬指令的需求。製造商專屬的指令處理常式應併入服務中,方法是擴充/修改服務。這項工作由裝置製造商負責,Android 不會指定。請注意,在服務中針對製造商專屬指令所做的任何變更,都不得干擾標準指令的處理方式,否則裝置將無法與 Android 相容。
  • HDMI-CEC 服務的存取權受防護等級 SignatureOrSystem 保護。只有系統元件或放置在 /system/priv-app 中的應用程式可以存取服務。這是為了保護服務,避免惡意應用程式濫用。

Android 支援 TV/Display(0)Playback device(4) 類型,可發出 One Touch Play 指令,成為有效來源,並支援 Audio System (5),可處理系統音訊模式和 ARC。目前不支援其他裝置類型 (Tuner 和 Recorder)。

HDMI-CEC HAL

HdmiControlService 可透過 HDMI-CEC HAL API 使用硬體資源傳送/接收 HDMI-CEC 指令、設定必要設定,以及 (選擇性) 與基礎平台中的微處理器通訊,在 Android 系統處於待機模式時接管 CEC 控制。

版本 功能 HAL 檔案
1.0 設定 HAL 資料 (位址、功能)。傳送 HDMI-CEC 指令。註冊回呼,接收 HDMI-CEC 指令和熱插拔事件。 IHdmiCec.hal
IHdmiCecCallback.hal
1.1 介紹 HDMI-CEC 2.0 類型 @1.1::IHdmiCec.hal
@1.1::IHdmiCecCallback.hal

測試

裝置的 HDMI-CEC 實作項目會根據 HDMI-CEC CTS 文件,透過 CTS 測試進行測試和驗證。

HDMI-CEC 2.0

Android 來源 (播放) 和接收器 (電視面板) 裝置支援 HDMI-CEC 2.0。 HDMI-CEC 2.0 可提升 HDMI 裝置之間的互通性、改善遙控器直通功能,並提供更全面的認證測試。一般來說,HDMI-CEC 2.0 與其他裝置的互動效率更高,因此 HDMI-CEC 流量較少,互動速度也更快。

如要讓裝置支援 HDMI-CEC 2.0,裝置和使用者設定必須設為使用 HDMI-CEC 2.0。此外,HAL 實作項目也必須在對 IHdmiCec#getCecVersion 的呼叫中,回報支援 HDMI-CEC 2.0。

CEC 設定

OEM 可以使用 RRO 在建構時設定 HDMI-CEC 行為,也可以使用 HdmiControlManager @SystemApi 在執行階段設定。

HDMI-CEC 設定範例:

設定 選項
HDMI-CEC 是否已啟用。 已啟用
已停用
播放裝置傳送的 HDMI-CEC 電源控制訊息範圍。 僅限電視
電視和音訊系統
廣播

應用程式可在執行階段查詢目前可用的每項設定和允許的選項。