Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

電視輸入框架

Android TV HAL圖標

Android TV輸入框架(TIF)簡化了向Android TV直播內容的交付。 Android TIF為製造商提供了標準API,以創建用於控制Android TV的輸入模塊,並通過TV Input發布的元數據啟用實時電視搜索和推薦。

該框架不尋求實現電視標准或地區要求,但是確實使設備製造商更容易滿足地區數字電視廣播標準而無需重新實施。本節中的文檔對於想要創建自定義電視輸入的第三方應用程序開發人員也可能有用。

組件

Android TV Input Framework實現包含一個TV Input Manager。 TIF與電視應用程序(不能由第三方應用程序替代的系統應用程序)一起使用,以訪問內置和IP調諧器頻道。 TV App通過TV Input Manager與設備製造商或其他方提供的TV Input模塊進行通信。

電視輸入框架包括:

  • 電視提供商( com.android.providers.tv.TvProvider ):頻道,節目和相關權限的數據庫
  • 電視應用程序( com.android.tv.TvActivity ):處理用戶交互的應用程序
  • 電視輸入管理器( android.media.tv.TvInputManager ):允許電視輸入與電視應用進行通信
  • 電視輸入:代表物理或虛擬調諧器和輸入端口的應用
  • TV輸入HAL( tv_input模塊):一個硬件定義允許系統電視輸入到訪問特定TV-硬件實現時
  • 家長控制:允許阻止頻道和節目的技術
  • HDMI-CEC:允許通過HDMI遠程控制各種設備的技術

這些組件將在下面詳細介紹。有關Android TV輸入框架架構的詳細視圖,請參見下圖。

Android TIF架構概述
圖1. Android TV輸入框架(TIF)架構

這是架構的執行方式:

  1. 用戶可以看到電視應用程序並與之交互,電視應用程序是不能由第三方應用程序替代的系統應用程序。
  2. 電視應用程序顯示來自電視輸入的AV內容。
  3. 電視應用程序無法直接與電視輸入進行通話。電視輸入管理器識別電視應用程序的電視輸入狀態。有關這些限制的更多詳細信息,請參見下面的電視輸入管理器

權限

  • 只有signatureOrSystem電視輸入和電視應用具有對電視提供商數據庫的完全訪問權限,並且能夠接收KeyEvent。
  • 僅系統TV Inputs可以通過TV Input Manager服務訪問TV Input HAL。通過電視輸入管理器會話可以一對一訪問電視輸入。
  • 第三方電視輸入對電視提供商數據庫具有程序包鎖定訪問權限,並且只能對匹配的程序包行進行讀/寫操作。
  • 第三方電視輸入可以顯示自己的內容,也可以顯示設備製造商的直通電視輸入(例如HDMI1)中的內容。他們無法顯示來自非直通電視輸入(例如內置或IPTV調諧器)的內容。
  • 硬件TV Input應用程序的TV_INPUT_HARDWARE權限,通知TV Input Manager服務在啟動時通知TV Input服務以調用TV Input Manager服務並添加其TV輸入。此權限允許硬件“電視輸入”應用程序每個“電視輸入”服務支持多個“電視輸入”,並且能夠動態添加和刪除其支持的“電視輸入”。

電視提供商

電視提供商數據庫存儲電視輸入中的頻道和節目。電視提供商還發布和管理關聯的權限,以便電視輸入只能看到他們自己的記錄。例如,特定的電視輸入只能看到其提供的頻道和節目,並且被禁止訪問任何其他電視輸入的頻道和節目。

電視提供商在內部將“廣播類型”映射為“規範類型”。電視輸入負責使用基礎廣播標準中的值填充“廣播類型”,並且“規範類型”字段將自動使用android.provider.TvContract.Genres的正確關聯類型填充。例如,對於廣播標準ATSC A / 65和類型為0x25(意為“體育”)的節目,電視輸入將使用字符串“體育”填充“廣播體裁”,而電視提供商將在其中填充“規範體裁”字段,映射值android.provider.TvContract.Genres.SPORTS

有關電視提供商的詳細視圖,請參見下圖。

Android TV提供商
圖2. Android TV提供程序

只有特權系統分區中的應用程序才能讀取整個TV Provider數據庫。

直通電視輸入不存儲頻道和節目。

除了頻道和節目的標準字段外,TV Provider數據庫還在每個表中提供了BLOB類型字段COLUMN_INTERNAL_PROVIDER_DATA ,TV Inputs可以使用該字段存儲任意數據。該BLOB數據可以包括自定義信息,例如關聯的調諧器的頻率,並且可以協議緩衝區或其他形式提供。可搜索字段可用於使某些渠道在搜索中不可用(例如,滿足特定於國家/地區的內容保護要求)。

數據庫字段示例

電視提供者支持頻道( android.provider.TvContract.Channels )和節目( android.provider.TvContract.Programs )表中的結構化數據。這些表由TV Inputs和系統應用程序(例如TV App)填充和訪問。這些表具有四種類型的字段:

  • 顯示:顯示字段包含應用程序可能希望用戶看到的信息,例如頻道名稱( 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權限來訪問整個數據庫。

電視輸入管理員

電視輸入管理器為整個Android電視輸入框架提供了中央系統API。它可以仲裁應用程序和電視輸入之間的交互,並提供家長控制功能。電視輸入管理器會話必須與電視輸入一對一創建。電視輸入管理器允許訪問已安裝的電視輸入,因此應用可以:

  • 列出電視輸入並檢查其狀態
  • 創建會話並管理監聽器

對於會話,除了可以使用TvContract.buildChannelUriForPassthroughInput()調整的直通電視輸入外,TV App只能將其調整為添加到電視提供商數據庫的URI。電視輸入也可以設置其音量。由設備製造商(簽名應用程序)或系統分區中安裝的其他應用程序提供並簽名的TV輸入將可以訪問整個TV Provider數據庫。此訪問權限可用於構建應用,以瀏覽和搜索所有可用的電視頻道和節目。

應用可能會創建一個TvInputCallback並將其註冊到android.media.tv.TvInputManager ,以便在TV Input的狀態更改或添加或刪除TV Input時進行回調。例如,當電視輸入斷開時,電視應用可以通過將其顯示為斷開並阻止其選擇來做出反應。

電視輸入管理器抽象了電視應用和電視輸入之間的通信。電視輸入管理器和電視輸入的標準界面允許多個設備製造商創建自己的電視應用,同時幫助所有第三方電視輸入在所有電視應用上正常工作。

電視輸入

TV Inputs是具有AndroidManifest.xml並已安裝(通過Play,預安裝或側載)的Android應用。 Android TV支持預安裝的系統應用程序,由設備製造商簽名的應用程序以及第三方TV Inputs。

某些輸入(例如HDMI輸入或內置調諧器輸入)只能由製造商提供,因為它們直接與基礎硬件對話。第三方可以在Google Play商店中以APK的形式提供其他內容,例如IPTV,移位和外部STB。下載並安裝後,可以在TV App中選擇新的輸入。

直通輸入示例

Android TV系統輸入
圖3. Android TV系統輸入

在此示例中,設備製造商提供的電視輸入是受信任的,並且可以完全訪問電視提供商。作為直通電視輸入,它不向電視提供商註冊任何頻道或節目。要獲取用於引用傳遞輸入的URI,請使用android.media.tv.TvContract實用工具方法buildChannelUriForPassthroughInput(String inputId) 。 TV App與TV Input Manager進行通信以到達HDMI TV Input。

內置調諧器示例

Android TV內置調諧器輸入
圖4. Android TV內置調諧器輸入

在此示例中,設備製造商提供的內置調諧器電視輸入是受信任的,並且可以完全訪問電視提供商。

第三方輸入示例

Android TV第三方輸入
圖5. Android TV第三方輸入

在此示例中,外部STB TV輸入由第三方提供。由於該TV Input無法直接訪問傳入的HDMI視頻輸入,因此它必須通過TV Input Manager並使用設備製造商提供的HDMI TV Input。

通過TV Input Manager,外部STB TV Input可以與HDMI TV Input進行通話,並要求其在HDMI1上顯示視頻。因此,在製造商提供的HDMI TV Input渲染視頻時,STB TV Input可以控制電視。

畫中畫(PIP)示例

Android TV KeyEvents
圖6. Android TV KeyEvents

上圖顯示瞭如何將遙控器上的按鈕傳遞到特定的電視輸入以進行畫中畫(PIP)顯示。這些按鈕的按下由設備製造商提供的硬件驅動程序解釋,將硬件掃描代碼轉換為Android鍵盤代碼,並將它們作為KeyEvents傳遞給標準Android 輸入管道 InputReaderInputDispatcher函數。如果電視應用程序處於焦點位置,它們會依次觸發事件。

僅系統電視輸入有資格接收InputEvents ,並且只有它們具有RECEIVE_INPUT_EVENT系統權限。電視輸入負責確定要使用的InputEvent,並應允許電視應用處理不需要使用的鍵。

TV App負責了解哪個系統電視輸入處於活動狀態(即由用戶選擇),並消除傳入的KeyEvents歧義並將其路由到正確的TV Input Manager會話,調用dispatchInputEvent()將事件傳遞給關聯的TV Input 。

MHEG-5輸入示例

下圖顯示了有關如何通過Android TIF路由KeyEvents詳細視圖。

Android TV紅色按鈕示例
圖7. Android TV Red按鈕示例

它描繪了紅色按鈕應用程序的流程,該流程在歐洲很常見,它使用戶可以在電視上訪問交互式應用程序。可以通過此傳輸流交付應用程序。單擊該按鈕後,用戶可以與這些廣播應用進行交互。例如,您可以使用這些廣播應用程序來訪問相關的網頁或體育比分。

請參閱廣播應用程序部分,以了解廣播應用程序如何與電視應用程序交互。

在此示例中:

  1. TV App處於焦點狀態並接收所有按鍵。
  2. KeyEvents (例如紅色按鈕)作為InputEvents.傳遞到活動的TV Input InputEvents.
  3. 系統電視輸入與MHEG-5堆棧集成,並具有RECEIVE_INPUT_EVENT系統權限。
  4. 接收到激活密鑰代碼(例如紅色按鈕)後,電視輸入會激活廣播應用。
  5. 電視輸入將KeyEvents用作InputEvents ,廣播應用程序是焦點,並處理InputEvents直到將其關閉。

注意 :第三方電視輸入永遠不會收到按鍵。

電視輸入HAL

電視輸入HAL有助於電視輸入的開發,以訪問特定於電視的硬件。與其他Android HAL一樣,TV Input HAL( tv_input )在AOSP源代碼樹中可用,並且供應商正在開發其實現。

電視應用

系統TV App向用戶展示直播電視內容。在Android平台旁邊提供了參考TV App(直播電視),可以按原樣使用,自定義,擴展或由設備製造商替換。 源代碼在Android開放源代碼項目中可用,您可以在參考電視應用文章中開始使用它。

設備製造商可以擴展其電視應用程序以實現設備製造商或特定於國家/地區的功能,但這不在TIF或參考電視應用程序的範圍內。

系統TV App至少需要處理以下任務:

設置和配置

  • 自動檢測電視輸入
  • 讓電視輸入啟動頻道設置
  • 控製家長設置
  • 編輯頻道

觀看中

  • 訪問和瀏覽所有電視頻道
  • 進入電視節目信息欄
  • 顯示電子節目指南(EPG)數據
  • 支持多種音頻和字幕軌道
  • 供應家長控制PIN碼挑戰
  • 允許電視輸入UI覆蓋電視標準(HbbTV等)
  • 填充電視頻道和節目的搜索結果
  • 顯示應用程序鏈接卡
  • 支持時移API
  • 處理DVR功能並支持電視錄製API

此功能集將與擴展了平台TIF API的新Android版本一致。 CTS Verifier提供了兼容性測試範圍。

支持第三方電視輸入

Android TV提供了用於第三方電視輸入的開發人員API,從而使已安裝的應用能夠將軟件頻道傳遞到實時電視體驗中。為確保兼容的Android設備實現,系統TV App承擔了向用戶顯示第三方TV輸入和頻道的某些責任。參考直播電視應用程序提供了兼容的實現;如果要替換系統TV App,設備製造商必須確保自己的應用程序提供相似的兼容性,以滿足所有Android TV設備上開發人員的期望。

系統TV App必須在設備的默認直播TV服務旁邊顯示第三方輸入。開發人員API的承諾是,用戶將能夠在其標準電視體驗中找到頻道(一旦安裝)。

根據Android CDD的TV App部分中的定義,允許在內置頻道和第三方頻道之間進行視覺區分。

以下各節說明了直播電視應用程序如何滿足CDD要求。

新頻道設定

添加新的第三方輸入/頻道始於用戶從應用商店(例如Google Play)中查找並安裝電視輸入。

某些第三方電視輸入會自動將頻道添加到TvProvider數據庫。但是,大多數將提供“設置”活動,以使用戶能夠設置其頻道,提供登錄詳細信息以及其他操作。系統TV App需要確保用戶可以激活此設置活動,這就是CDD要求第三方輸入的原因,以便在遠離主TV App的情況下進行最少的導航操作。

參考電視節目提供了“頻道源”菜單,用於訪問輸入。

前往設置
圖8.轉到設置

在設置中轉到頻道源
圖9.轉到“設置”中的“ 頻道來源 ”。

從列表中選擇您的來源。
圖10.從列表中選擇您的來源。

從您的來源添加頻道
圖11.從您的來源添加頻道。

另外,在安裝新的TvInput之後,TV App菜單的頂部會顯示一個通知卡,以使用戶直接進入設置程序:

顯示新頻道來源的通知可用。
圖12.通知顯示新的頻道來源可用。

如果用戶通過通知採取措施,則可以選擇設置其來源,如圖10所示。

請參閱定義電視輸入服務以了解開發人員在此方面的期望。

自定義頻道列表

設備製造商可以提供UI來隱藏某些頻道,並使用戶能夠管理自己的EPG。直播電視包括此設施。

在設置中打開頻道列表。
圖13.Settings中打開頻道列表。

自定義您的頻道列表。
圖14.自定義您的頻道列表。

電子節目單

第三方輸入開發人員需要確信,用戶可以在常規使用期間跨所有兼容的Android TV設備輕鬆導航到其頻道。

來自第三方輸入的頻道必須作為設備標准直播電視體驗EPG的一部分進行呈現。可以使用第三方頻道的視覺分隔或單獨類別(請參閱Android CDD的TV App部分)-關鍵是用戶可以找到他們已安裝的頻道。

製造商必須實施TV App來包含針對全局搜索請求的搜索結果,以確保最佳的用戶體驗。直播電視提供了一個實現(請參閱com.android.tv.search.TvProviderSearch ),該實現提供了來自第三方輸入(平台兼容性所需)以及內置輸入的結果。

時移

對於Android 6.0及更高版本上的設備,電視應用必須支持Android框架時移API 。此外,製造商必須在TV App中實現播放控件,該控件允許用戶暫停,繼續,倒帶和快進播放。

對於支持時移的電視輸入,電視應用需要顯示播放控件。

播放控制
圖15.播放控件

硬盤錄像機

對於Android 7.0及更高版本上的設備,電視應用必須支持Android框架電視錄製API ,才能支持,列出和播放錄製的節目。

這使設備製造商可以將其DVR子系統插入TIF,並大大減少了在電視設備上啟用或集成DVR功能所需的集成工作。它還使第三方能夠提供可插入Android TV設備的售後DVR系統。

除了錄製直播內容,TV App還可以處理資源衝突。例如,如果設備有兩個調諧器,則它可以同時記錄兩個節目。如果用戶要求錄製三個,則TV App必須處理衝突,並且應該顯示通知或要求用戶為這些請求安排優先級。

TV Apps還可以實現更複雜的邏輯,例如在用戶要求錄製一個情節時詢問用戶是否要錄製系列中的所有未來情節。

請參見下圖,以了解Android TV中可能的DVR實現。

Android TV中的數字視頻錄製
圖16. Android TV中的數字視頻錄製

  1. 電視輸入服務會告訴電視應用程序有多少個可用的調諧器,以便電視應用程序可以處理可能的資源衝突。
  2. 電視應用接收用戶發起的錄製電視節目的請求。
  3. TV App將錄製時間表存儲在其內部數據庫中。
  4. 錄製時間到了,TV App會傳遞一個請求,以調諧到與錄製相關的頻道。
  5. 電視輸入服務收到此請求,以是否有適當的資源作為響應,並調諧到該頻道。
  6. 然後,TV App將請求開始錄製的請求傳遞給TV Input Manager。
  7. 電視輸入服務收到此請求並開始錄製。
  8. 電視輸入服務將實際的視頻數據存儲在其存儲中,該存儲可以是外部存儲或云存儲。
  9. 當需要結束錄製時,TV App將停止錄製請求傳遞給TV Input Manager。
  10. 電視輸入服務收到請求後,將停止錄製並將其關聯的元數據添加到電視提供商,以便電視應用程序可以在請求時向用戶顯示錄製內容。

有關在電視輸入服務中實現錄製功能的詳細信息,請參閱此電視錄製文章。

有用的資源

  • Android CDD和記錄的開發人員API是權威參考。
  • CTS Verifier會將API用作兼容性測試程序的一部分。在Live TV上運行此功能可能是查看EPG,搜索,家長控制以及第三方輸入上下文中其他要求的有用方法。
  • 請參閱定義電視輸入服務以了解開發人員在此方面的期望。

家長控制

家長控制使用戶可以阻止不需要的頻道和節目,但可以通過輸入PIN碼來繞過該阻止。

TV App,TV Input Manager服務,TV Provider和TV Input之間共同承擔家長控制功能的責任。

家長控制是強制性的,並且由CTS驗證程序涵蓋。

許多國家/地區已經定義了電視輸入可以通過TVContentRating API使用的分級系統。此外,電視輸入可以註冊自己的自定義分級系統,如CTS驗證程序測試所演示的那樣,該測試引入了“偽”分級。對於存在標準分級系統的國家,鼓勵設備製造商將電視輸入框架家長控制與他們可能包括的任何其他機制結合起來。

電視提供商

每個頻道行都有一個COLUMN_LOCKED字段,該字段用於鎖定特定頻道,而無需輸入PIN碼。程序字段COLUMN_CONTENT_RATING用於顯示,並不用於強制執行家長控制。

電視輸入管理員

電視輸入管理器會存儲每個被阻止的TvContentRating並響應isRatingBlocked()以告知是否應阻止具有給定等級的內容。

電視輸入

當顯示內容的等級已更改(在節目或頻道更改時)或父母控制設置已更改(在ACTION_BLOCKED_RATINGS_CHANGEDACTION_PARENTAL_CONTROLS_ENABLED_CHANGED )時,TV Input檢查是否應通過在TV Input Manager上調用isRatingBlocked()來阻止當前內容。 。如果內容應被阻止,則TV Input會禁用音頻和視頻,並通過調用notifyContentBlocked(TvContentRating)通知TV應用程序當前內容已被阻止。如果不應阻止內容,則TV Input會啟用音頻和視頻,並通過調用notifyContentAllowed()通知TV App當前內容已允許。

電視應用

為了兌現家長控制API,並因此創建兼容的平台,系統TV App需要為用戶提供一種管理家長控制的方法,包括對特定應用程序註冊的任何自定義分級的管理。

當電視輸入收到當前內容已被阻止或用戶嘗試查看被阻止的頻道時,電視應用會顯示PIN碼UI。

電視應用程序不直接存儲父母控制設置。當用戶更改家長控制設置時,每個被阻止的TvContentRating由電視輸入管理器存儲,被阻止的頻道由電視提供商存儲。

TV App需要聲明權限android.permission.MODIFY_PARENTAL_CONTROLS才能更改家長控制設置。

鼓勵設備製造商:

  • 針對參考直播電視應用程序進行CTS驗證程序家長控制測試,以證明兼容性要求。
  • 使用直播電視應用作為自己電視應用的參考:特別是請參閱ContentRatingsManagerRatingSystemsFragment源,以及它們如何處理自定義評級。

HDMI-CEC

HDMI-CEC允許一個設備控制另一設備,從而使單個遙控器可以控製家庭影院中的多個設備。 Android TV使用它來加快設置速度,並允許通過中央TV App遠程控制各種TV輸入。例如,它可以切換輸入,打開或關閉設備電源等等。

Android TIF將HDMI-CEC實現為HDMI控制服務,因此設備製造商僅需開發與輕量級Android TV HAL交互的低級驅動程序,從而跳過更複雜的業務邏輯。在提供標準實現時,Android試圖通過減少零散的實現和選擇性功能支持來緩解兼容性問題。 HDMI控制服務使用現有的Android服務,包括輸入和電源。

這意味著將需要重新設計現有的HDMI-CEC實現,以與Android TIF互操作。我們建議硬件平台包含一個微處理器,以接收CEC上電和其他命令。

Android TV上的CEC集成
圖17. Android TV上的CEC集成

  1. CEC總線從當前活動的源接收命令以切換到其他源。
  2. 驅動程序將該命令傳遞給HDMI-CEC HAL。
  3. HAL通知所有ActiveSourceChangeListeners
  4. 通過ActiveSourceChangeListener通知HDMI控制服務源更改。
  5. 電視輸入管理器服務為電視應用程序生成了切換源的意圖。
  6. 然後,TV App為切換到的TV Input創建一個TV Input Manager會話,並在該會話上調用setMain
  7. 電視輸入管理器會話將該信息傳遞到HDMI電視輸入。
  8. HDMI TV輸入請求設置邊帶錶面。
  9. 設置表面後,電視輸入管理器服務會生成一個相應的路由控制命令,返回到HDMI控制服務。

電視整合指南

廣播應用

由於每個國家/地區都有廣播特定的要求(MHEG,圖文電視,HbbTV等),因此,製造商應為廣播應用提供自己的解決方案,例如:

  • MHEG:本機堆棧
  • 圖文電視:本機堆棧
  • HbbTV:Vewd Software的HbbTV解決方案

在Android L版本中,Android TV期望設備製造商為區域電視堆棧使用系統集成商或Android解決方案,將表面傳遞給電視軟件堆棧,或傳遞必要的關鍵代碼以與舊堆棧交互。

廣播應用程序和電視應用程序的交互方式如下:

  1. TV App處於焦點,接收所有按鍵。
  2. TV App將按鍵(例如紅色按鈕)傳遞給TV Input設備。
  3. 電視輸入設備在內部與舊式電視堆棧集成。
  4. 電視輸入設備接收到激活密鑰代碼(例如紅色按鈕)後,將激活廣播應用程序。
  5. 廣播應用程序將重點放在電視應用程序中,並處理用戶操作。

對於語音搜索/推薦,廣播應用可能支持應用內搜索進行語音搜索。