Android TV 輸入框架 (TIF) 簡化了向 Android TV 傳輸即時內容的過程。 Android TIF 為製造商提供了一個標準 API,用於建立用於控制 Android TV 的輸入模組,並透過 TV Input 發布的元資料實現即時電視搜尋和推薦。
該框架並不尋求實施電視標準或區域要求,但確實使設備製造商更容易滿足區域數位電視廣播標準,而無需重新實施。本節中的文件對於想要建立自訂電視輸入的第三方應用程式開發人員也可能有用。
成分
Android TV 輸入框架實作包括 TV 輸入管理器。 TIF 與 TV 應用程式(無法被第三方應用程式取代的系統應用程式)配合使用,以存取內建頻道和 IP 調諧器頻道。電視應用程式透過電視輸入管理器與設備製造商或其他方提供的電視輸入模組進行通訊。
電視輸入框架包括:
- 電視提供者 (
com.android.providers.tv.TvProvider
):頻道、節目和相關權限的資料庫 - TV App (
com.android.tv.TvActivity
):處理使用者互動的應用程式 - 電視輸入管理器 (
android.media.tv.TvInputManager
):允許電視輸入與電視應用程式進行通信 - 電視輸入:代表實體或虛擬調諧器和輸入連接埠的應用程式
- TV 輸入 HAL(
tv_input
模組):一種硬體定義,允許系統 TV 輸入在實現時存取特定於 TV 的硬體 - 家長監護:允許阻止頻道和節目的技術
- HDMI-CEC:允許透過 HDMI 遠端控制各種設備的技術
- 調諧器框架:內建調諧器電視輸入的框架
- MediaCas:條件存取框架
- 調諧器資源管理器:管理電視輸入、MediaCas 和內建調諧器輸入的硬體資源的服務
以下詳細介紹這些組件。請參閱下圖,以了解 Android TV 輸入框架架構的詳細視圖。
流動
以下是此架構的運用方式:
- 用戶看到的是 TV App 並與之交互,這是一個無法被第三方應用程式取代的系統應用程式。
- 電視應用程式顯示來自電視輸入的 AV 內容。
- 電視應用程式無法直接與電視輸入對話。電視輸入管理器可識別電視應用程式的電視輸入狀態。有關這些限制的更多詳細信息,請參閱下面的電視輸入管理器。
權限
- 只有
signatureOrSystem
電視輸入和電視應用程式具有對電視提供者資料庫的完全存取權限,並且能夠接收KeyEvents。 - 只有系統電視輸入可以透過電視輸入管理器服務存取電視輸入 HAL。透過電視輸入管理器會話一對一地存取電視輸入。
- 第三方電視輸入具有對電視提供者資料庫的包鎖定存取權限,並且只能讀取/寫入匹配的包行。
- 第三方電視輸入可以顯示自己的內容,也可以顯示來自設備製造商的直通電視輸入(例如 HDMI1)的內容。它們無法顯示來自非直通電視輸入的內容,例如內建或 IPTV 調諧器。
- 硬體電視輸入應用程式的
TV_INPUT_HARDWARE
權限,向電視輸入管理器服務發出訊號,通知電視輸入服務在啟動時呼叫電視輸入管理器服務並新增其電視輸入。此權限允許硬體電視輸入應用程式支援每個電視輸入服務的多個電視輸入,並且能夠動態新增和刪除其支援的電視輸入。
電視提供者
電視提供者資料庫儲存來自電視輸入的頻道和節目。電視供應商也會發布和管理相關權限,以便電視輸入只能看到自己的記錄。例如,特定的電視輸入只能看到它提供的頻道和節目,並且禁止訪問任何其他電視輸入的頻道和節目。
電視提供商在內部將“廣播類型”映射到“規範類型”。電視輸入負責使用底層廣播標準中的值填充“廣播類型”,並且“規範類型”欄位將自動填入android.provider.TvContract.Genres
中正確的關聯類型。例如,對於廣播標準ATSC A/65 和流派0x25(表示“體育”)的節目,電視輸入將使用字串“體育”填充“廣播流派”,電視提供者將使用字串“體育”填充“規範流派”字段映射值android.provider.TvContract.Genres.SPORTS
。
有關電視提供者的詳細視圖,請參閱下圖。
只有特權系統分割區中的應用程式才能讀取整個電視提供者資料庫。
直通電視輸入不儲存頻道和節目。
除了頻道和節目的標準欄位之外,電視提供者資料庫還在每個表中提供 BLOB 類型欄位COLUMN_INTERNAL_PROVIDER_DATA
,電視輸入可使用該欄位來儲存任意資料。此BLOB資料可以包括自訂訊息,例如相關調諧器的頻率,並且可以以協定緩衝區或另一種形式提供。可搜尋欄位可用於使某些頻道在搜尋中無法使用(例如滿足國家/地區特定的內容保護要求)。
資料庫欄位範例
TV Provider 支援頻道 ( android.provider.TvContract.Channels
) 和節目 ( android.provider.TvContract.Programs
) 表中的結構化資料。這些表由電視輸入和電視應用程式等系統應用程式填充和存取。這些表有四種類型的欄位:
- 顯示:顯示欄位包含應用程式可能希望使用者可見的信息,例如頻道名稱 (
COLUMN_DISPLAY_NAME
) 或編號 (COLUMN_DISPLAY_NUMBER
),或正在觀看的節目的標題。 - 元資料:根據相關標準,有三個欄位用於識別內容,例如頻道的傳輸流ID(
COLUMN_TRANSPORT_STREAM_ID
)、原始網路ID(COLUMN_ORIGINAL_NETWORK_ID
)和服務ID(COLUMN_SERVICE_ID
)。 - 內部資料:供電視輸入自訂使用的欄位。
某些字段(例如COLUMN_INTERNAL_PROVIDER_DATA
)是可自訂的 BLOB 字段,電視輸入可以在其中儲存有關其頻道或節目的任意元資料。 - 標誌:標誌欄位表示是否應限制某個頻道的搜尋、瀏覽或檢視。這只能在通道層級設定。所有節目均遵循頻道上的設定。
-
COLUMN_SEARCHABLE
:在某些地區可能需要限制某些頻道的搜尋。COLUMN_SEARCHABLE = 0
表示頻道不應在搜尋結果中公開。 -
COLUMN_BROWSABLE
:僅對系統應用程式可見。限制應用程式瀏覽頻道。COLUMN_BROWSABLE = 0
表示該頻道不應包含在頻道清單中。 -
COLUMN_LOCKED
:僅對系統應用程式可見。限制無效帳戶在不輸入 PIN 碼的情況下查看頻道。COLUMN_LOCKED = 1
表示頻道應受家長監護保護。
有關更詳盡的欄位列表,請參閱android/frameworks/base/media/java/android/media/tv/TvContract.java
權限和存取控制
有權存取相應行的任何人都可以看到所有欄位。用戶無法直接存取任何字段;他們只能看到電視應用程式、系統應用程式或電視輸入所顯示的內容。
- 每行都有
PACKAGE_NAME
,即擁有該行的套件(應用程式),透過 TvProvider.java 檢查查詢、插入、更新。電視輸入只能存取其寫入的信息,並且與其他電視輸入提供的信息隔離。 - 透過 AndroidManifest.xml 讀取、寫入權限(需要使用者同意)以決定可用通道。
- 只有
signatureOrSystem
應用程式可以獲得ACCESS_ALL_EPG_DATA
權限來存取整個資料庫。
電視輸入管理器
TV 輸入管理器為整個 Android TV 輸入框架提供中央系統 API。它仲裁應用程式和電視輸入之間的互動並提供家長監護功能。電視輸入管理器會話必須與電視輸入一對一地建立。電視輸入管理器允許存取已安裝的電視輸入,因此應用程式可以:
- 列出電視輸入並檢查其狀態
- 建立會話並管理偵聽器
對於會話,電視輸入只能由電視應用程式調整到已新增至電視提供者資料庫的 URI,但直通電視輸入除外,可以使用TvContract.buildChannelUriForPassthroughInput()
進行調整。電視輸入也可以設定其音量。由設備製造商(簽名應用程式)或安裝在系統分區中的其他應用程式提供和簽署的電視輸入將有權存取整個電視提供者資料庫。此存取權限可用於建立應用程式來瀏覽和搜尋所有可用的電視頻道和節目。
應用程式可以使用android.media.tv.TvInputManager
建立和註冊TvInputCallback
,以便在電視輸入的狀態變更或新增或刪除電視輸入時進行回調。例如,電視應用程式可以在電視輸入斷開連接時做出反應,將其顯示為已斷開連接並阻止其選擇。
電視輸入管理器抽象化了電視應用程式和電視輸入之間的通訊。電視輸入管理器和電視輸入的標準介面允許多個設備製造商創建自己的電視應用程序,同時幫助所有第三方電視輸入在所有電視應用程式上工作。
電視輸入
TV Inputs 是 Android 應用程序,因為它們具有 AndroidManifest.xml 並已安裝(透過 Play、預先安裝或旁加載)。 Android TV 支援預先安裝系統應用程式、裝置製造商簽署的應用程式和第三方電視輸入。
某些輸入(例如 HDMI 輸入或內建調諧器輸入)只能由製造商提供,因為它們直接與底層硬體通訊。其他功能,例如 IPTV、異地移位和外部 STB,可以由第三方在 Google Play 商店上以 APK 形式提供。下載並安裝後,可以在電視應用程式中選擇新的輸入。
直通輸入範例
在此範例中,設備製造商提供的電視輸入受到信任,並且可以完全存取電視提供者。作為直通電視輸入,它不會向電視提供者註冊任何頻道或節目。若要取得用於引用直通輸入的 URI,請使用android.media.tv.TvContract
實用方法buildChannelUriForPassthroughInput(String inputId)
。電視應用程式與電視輸入管理器通訊以到達 HDMI 電視輸入。
內建調諧器範例
在此範例中,設備製造商提供的內建調諧器電視輸入受到信任,並且具有對電視提供者的完全存取權。
第三方輸入範例
在此範例中,外部 STB TV 輸入由第三方提供。由於電視輸入無法直接存取傳入的 HDMI 視訊來源,因此它必須透過電視輸入管理器並使用裝置製造商提供的 HDMI 電視輸入。
透過電視輸入管理器,外部機上盒電視輸入可與 HDMI 電視輸入對話並要求其在 HDMI1 上顯示視訊。因此,STB 電視輸入可以控制電視,而製造商提供的 HDMI 電視輸入則可以渲染影片。
畫中畫 (PIP) 範例
上圖顯示如何將遙控器上的按鈕傳遞到特定電視輸入以進行畫中畫 (PIP) 顯示。這些按鈕按下由設備製造商提供的硬體驅動程式進行解釋,將硬體掃描代碼轉換為 Android 按鍵代碼,並將它們作為KeyEvents傳遞到標準 Android輸入管道InputReader
和InputDispatcher
函數。如果電視應用程式處於焦點狀態,這些反過來會觸發電視應用程式上的事件。
只有系統 TV 輸入才有資格接收InputEvents
,並且僅當它們具有RECEIVE_INPUT_EVENT
系統權限時。 TV Input 負責決定要使用哪些 InputEvent,並應允許 TV App 處理它不需要使用的按鍵。
TV 應用程式負責了解哪個系統 TV 輸入處於活動狀態(即由使用者選擇),並消除傳入的KeyEvents
並將它們路由到正確的 TV 輸入管理器會話,呼叫dispatchInputEvent()
將事件傳遞到關聯的TV 輸入。
MHEG-5 輸入範例
下圖顯示如何透過 Android TIF 路由KeyEvents
的更詳細視圖。
它描述了紅色按鈕應用程式的流程,該應用程式在歐洲很常見,用於讓用戶在電視上存取互動式應用程式。可以透過此傳輸流交付應用程式。單擊該按鈕後,用戶可以與這些廣播應用程式進行互動。例如,您可以使用這些廣播應用程式來存取相關網頁或體育比分。
請參閱廣播應用程式部分,以了解廣播應用程式如何與電視應用程式互動。
在這個例子中:
- 電視應用程式處於焦點並接收所有按鍵。
-
KeyEvents
(例如紅色按鈕)作為InputEvents.
- 系統 TV Input 與 MHEG-5 堆疊集成,並具有
RECEIVE_INPUT_EVENT
系統權限。 - 收到啟動鍵碼(例如紅色按鈕)後,電視輸入將啟動廣播應用程式。
- 電視輸入將
KeyEvents
作為InputEvents
進行消費,廣播應用程式是焦點並處理InputEvents
直到關閉。
注意:第三方電視輸入永遠不會接收金鑰。
電視輸入 HAL
電視輸入 HAL 有助於開發電視輸入以存取特定於電視的硬體。與其他 Android HAL 一樣,TV 輸入 HAL ( tv_input
) 在 AOSP 原始碼樹中可用,並且供應商開發其實作。
注意:從 Android 14 開始,TV 輸入 HAL 介面使用AIDL定義。
電視應用程式
系統TV App向用戶呈現直播電視內容。 Android 平台隨附提供參考電視應用程式(Live TV),裝置製造商可以原樣使用、自訂、擴充或替換。原始碼可在 Android 開源專案中找到,您可以在參考電視應用程式文章中開始使用它。
設備製造商可以擴展其電視應用程式以實現設備製造商或國家/地區特定的功能,但這不屬於 TIF 或參考電視應用程式的範圍。
系統TV App至少需要處理以下任務:
設定和配置
- 自動偵測電視輸入
- 讓 TV 輸入啟動頻道設置
- 控製家長設定
- 編輯頻道
觀看
- 存取和導航所有電視頻道
- 造訪電視節目資訊欄
- 顯示電子節目指南 (EPG) 數據
- 支援多種音軌和字幕軌
- 提供家長監護 PIN 碼挑戰
- 允許電視輸入 UI 覆蓋電視標準(HbbTV 等)
- 填充電視頻道和節目的搜尋結果
- 顯示應用程式連結卡
- 支援時移API
- 處理 DVR 功能並支援電視錄製 API
此功能集將隨著新的 Android 版本而增加,其中平台 TIF API 擴展。 CTS Verifier 提供相容性測試覆蓋範圍。
支援第三方電視輸入
Android TV 為第三方電視輸入提供開發人員 API,使已安裝的應用程式能夠將軟體頻道傳遞到直播電視體驗中。為了確保相容的 Android 裝置實現,系統電視應用程式有一些責任向用戶顯示第三方電視輸入和頻道。參考直播電視應用程式提供了相容的實現;如果更換系統電視應用程序,設備製造商必須確保自己的應用程式提供類似的相容性,以滿足開發人員對所有 Android TV 裝置的期望。
系統電視應用程式必須與裝置的預設直播電視服務一起顯示第三方輸入。開發人員 API 的承諾是用戶將能夠在其標準電視體驗中找到頻道(一旦安裝)。
允許內建頻道和第三方頻道之間存在視覺差異,如 Android CDD 的 TV 應用程式部分所定義。
以下部分展示了直播電視應用程式如何滿足 CDD 要求。
新頻道設定
新增新的第三方輸入/頻道首先是用戶從應用程式商店(例如 Google Play)尋找並安裝 TV Input。
某些第三方電視輸入會自動將頻道新增至 TvProvider 資料庫。不過,大多數都會提供設定活動,以使用戶能夠設定其頻道、提供登入詳細資訊和其他操作。系統電視應用程式需要確保用戶可以啟動此設定活動,這就是為什麼 CDD 要求第三方輸入是遠離主電視應用程式的最少導航操作。
參考直播電視應用程式提供了用於存取輸入的頻道來源選單。
此外,安裝新的 TvInput 後,電視應用程式選單頂部會顯示通知卡,以便用戶直接進入設定:
如果使用者透過通知採取操作,他們可以選擇設定其來源,如圖 10 所示。
請參閱定義您的電視輸入服務以了解開發人員在此領域的期望。
自訂頻道列表
設備製造商可能會提供 UI 來隱藏某些頻道並使用戶能夠管理自己的 EPG。直播電視包括此設施。
電子節目指南
第三方輸入開發人員需要確信用戶可以在一般使用期間在所有相容的 Android TV 裝置上輕鬆導航到他們的頻道。
來自第三方輸入的頻道必須作為設備標準直播電視體驗 EPG 的一部分呈現。可以對第三方頻道使用視覺分離或單獨的類別(請參閱 Android CDD 的電視應用程式部分)—關鍵是使用者能夠找到他們已安裝的頻道。
搜尋
製造商必須實施電視應用程式以包含全球搜尋請求的搜尋結果,以確保最佳的使用者體驗。 Live TV 提供了一個實作(請參閱它提供來自第三方輸入(平台相容性所需)以及內建輸入的結果。
時移
對於Android 6.0以上版本的設備,TV App必須支援Android框架時移API 。此外,製造商必須在 TV 應用程式中實現播放控件,允許用戶暫停、恢復、快退和快轉播放。
對於支援時移的電視輸入,電視應用程式需要顯示播放控制。
硬碟錄影機
對於Android 7.0以上版本的設備,TV App必須支援Android框架TV錄製API ,以支援、列出和播放錄製的節目。
這使得設備製造商能夠將其 DVR 子系統插入 TIF,並顯著減少在電視設備上啟用或整合 DVR 功能所需的整合工作。它還使第三方能夠提供可插入 Android TV 裝置的售後 DVR 系統。
除了錄製直播內容外,TV App 還處理資源衝突。例如,如果裝置有兩個調諧器,則可以同時錄製兩個節目。如果使用者要求錄製三個,電視應用程式必須處理衝突,並且應該顯示通知或請求使用者為這些請求安排優先順序。
電視應用程式還可以實現更複雜的邏輯,例如當用戶要求錄製一集時詢問用戶是否願意錄製系列中所有未來的劇集。
請參閱下圖,了解 Android TV 中可能的 DVR 實作。
- TV 輸入服務告訴 TV App 有多少調諧器可用,以便 TV App 可以處理可能的資源衝突。
- TV App接收用戶發起的錄製電視節目的請求。
- 電視應用程式將錄製時間表儲存在其內部資料庫中。
- 當需要錄製時,電視應用程式會發送請求以調至與錄製相關的頻道。
- 電視輸入服務接收此請求,回應是否有適當的資源,並調諧到頻道。
- 然後,電視應用程式將開始錄製的請求傳遞給電視輸入管理器。
- 電視輸入服務收到此請求並開始錄製。
- TV 輸入服務將實際視訊資料儲存在其儲存中,該儲存可以是外部儲存或雲端儲存。
- 當需要完成錄製時,TV 應用程式會將停止錄製請求傳遞給 TV 輸入管理器。
- 一旦 TV 輸入服務收到請求,它就會停止錄製並將其關聯的元資料新增至 TV Provider,以便 TV 應用程式可以在請求時向使用者顯示錄製內容。
有關在 TV 輸入服務中實現錄製功能的更多信息,請參閱此電視錄製文章。
有用的資源
- Android CDD和記錄的開發人員 API 是權威的參考。
- CTS Verifier 將 API 作為相容性測試計畫的一部分進行測試。針對直播電視運行此功能可能是查看 EPG、搜尋、家長監護和第三方輸入上下文中的其他要求的有用方法。
- 請參閱定義您的電視輸入服務以了解開發人員在此領域的期望。
家長監護
家長監護允許使用者阻止不需要的頻道和節目,但可以透過輸入 PIN 碼來繞過阻止。
家長監護功能的責任由電視應用程式、電視輸入管理器服務、電視提供者和電視輸入共同承擔。
家長監護是強制性的,並由 CTS Verifier 涵蓋。
許多國家已經定義了 TV Inputs 可以透過TVContentRating API使用的評級系統。此外,TV Inputs 可以註冊自己的自訂評級系統,如 CTS Verifier 測試所示,該系統引入了「假」評級。對於存在標準評級系統的國家/地區,鼓勵設備製造商將電視輸入框架家長監護與他們可能包含的任何其他機制結合。
電視提供者
每個頻道行都有一個COLUMN_LOCKED
字段,用於鎖定特定頻道,使其無法在不輸入 PIN 碼的情況下觀看。程式欄位COLUMN_CONTENT_RATING
用於顯示,不用於強製家長監護。
電視輸入管理器
TV 輸入管理器儲存每個被封鎖的TvContentRating
並回應isRatingBlocked()
以建議是否應阻止具有給定評級的內容。
電視輸入
當顯示內容的分級已更改(節目或頻道更改時)或家長控制設定已更改(在ACTION_BLOCKED_RATINGS_CHANGED
和ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED
上)時,電視輸入會檢查是否應透過在電視輸入管理器上呼叫isRatingBlocked()
來阻止當前內容。如果內容應該被阻止,電視輸入會停用音頻和視頻,並透過呼叫notifyContentBlocked(TvContentRating)
通知電視應用程式目前內容被阻止。如果內容不應被阻止,電視輸入將啟用音頻和視頻,並透過呼叫notifyContentAllowed()
通知電視應用程式目前內容已被允許。
電視應用程式
為了遵守家長監護 API 並因此創建相容平台,系統 TV 應用程式需要為使用者提供一種管理家長控制的方法,包括特定應用程式註冊的任何自訂收視率。
當電視輸入通知目前內容被封鎖或使用者嘗試觀看被封鎖的頻道時,電視應用程式會顯示 PIN 碼 UI。
TV 應用程式不會直接儲存家長監護設定。當使用者更改家長控制設定時,每個被封鎖的TvContentRating
由電視輸入管理器存儲,並且被封鎖的頻道由電視提供者儲存。
TV應用程式需要聲明權限android.permission.MODIFY_PARENTAL_CONTROLS
才能更改家長監護設定。
鼓勵設備製造商:
- 針對參考直播電視應用程式進行 CTS Verifier 家長監護測試,以示範相容性要求。
- 使用 Live TV 應用程式作為自己的電視應用程式的參考:特別是請參閱ContentRatingsManager和RatingSystemsFragment來源,以及它們如何處理自訂評級。
HDMI-CEC
HDMI-CEC 允許一台設備控制另一台設備,從而使單一遙控器能夠控製家庭劇院中的多個設備。 Android TV 使用它來加速設定並允許透過中央電視應用程式遠端控制各種電視輸入。例如,它可以切換輸入、開啟或關閉裝置等等。
Android TIF 將 HDMI-CEC 實現為 HDMI 控制服務,因此設備製造商只需開發與輕量級 Android TV HAL 交互的低級驅動程序,跳過更複雜的業務邏輯。在提供標準實作時,Android 試圖透過減少零散的實作和選擇性功能支援來緩解相容性問題。 HDMI控制服務使用現有的Android服務,包括輸入和電源。
這意味著現有的 HDMI-CEC 實作需要重新設計才能與 Android TIF 互通。我們建議硬體平台包含一個微處理器來接收CEC開機和其他指令。
- CEC 總線接收來自目前活動來源的命令以切換到不同的來源。
- 驅動程式將命令傳遞給 HDMI-CEC HAL。
- HAL 通知所有
ActiveSourceChangeListeners
。 - HDMI 控制服務透過
ActiveSourceChangeListener
收到來源變更通知。 - TV 輸入管理器服務產生電視應用程式切換來源的意圖。
- 然後,電視應用程式為要切換到的電視輸入建立電視輸入管理器會話,並在該會話上呼叫
setMain
。 - 電視輸入管理器會話將此資訊傳遞到 HDMI 電視輸入。
- HDMI TV 輸入請求設定邊帶表面。
- 設定表面時,電視輸入管理器服務會產生對應的路由控制指令返回 HDMI 控制服務。
電視整合指南
廣播應用程式
由於每個國家都有特定於廣播的要求(MHEG、圖文電視、HbbTV 等),因此製造商應為廣播應用程式提供自己的解決方案,例如:
- MHEG:本機堆疊
- 圖文電視:本機堆疊
- HbbTV:Vewd Software 的 HbbTV 解決方案
在 Android L 版本中,Android TV 期望設備製造商使用系統整合商或區域電視堆疊的 Android 解決方案,將介面傳遞給電視軟體堆疊,或傳遞必要的關鍵程式碼以與舊堆疊進行互動。
以下是廣播應用程式和電視應用程式的互動方式:
- 電視應用程式處於焦點狀態,接收所有按鍵。
- 電視應用程式將按鍵(例如紅色按鈕)傳遞到電視輸入裝置。
- 電視輸入設備在內部與傳統電視堆疊整合。
- 接收到啟動鍵碼(例如紅色按鈕)後,電視輸入裝置將啟動廣播應用程式。
- 廣播應用程式將焦點放在電視應用程式中並處理使用者操作。
對於語音搜尋/推薦,廣播應用程式可以支援語音搜尋的應用程式內搜尋。