電視輸入服務可讓使用者透過時間轉移 API 暫停及繼續播放頻道。Android 7.0 會隨時間轉移展開,使用者可以儲存多個記錄的工作階段。
使用者可以預先排定錄影時間,或是在觀看節目時開始錄製。系統儲存錄製內容後,使用者可以透過系統電視應用程式瀏覽、管理及播放錄製內容。
如果想為電視輸入服務提供錄製功能,您必須向系統表明應用程式支援錄製、實作錄製節目、處理及傳達錄製期間發生的錯誤,以及管理錄製的工作階段。
指出支援錄製功能
如要告知系統您的電視輸入服務支援錄製功能,請將服務中繼資料 XML 檔案中的 android:canRecord
屬性設為 true
:
<tv-input xmlns:android="http://schemas.android.com/apk/res/android" android:canRecord="true" android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" />
如要進一步瞭解服務中繼資料檔案,請參閱「在資訊清單中宣告電視輸入服務」。
或者,您也可以在程式碼中,使用以下步驟指出記錄支援:
- 在電視輸入服務
onCreate()
方法中,使用TvInputInfo.Builder
類別建立新的TvInputInfo
物件。 - 建立新的
TvInputInfo
物件時,請先呼叫setCanRecord(true)
再呼叫build()
,以表示您的服務支援錄製功能。 - 呼叫
TvInputManager.updateTvInputInfo()
,向系統註冊TvInputInfo
物件。
錄製課程內容
電視輸入服務註冊可支援錄製功能後,當系統需要存取應用程式的錄製實作時,就會呼叫 TvInputService.onCreateRecordingSession()
方法。實作自己的 TvInputService.RecordingSession
子類別,並在 onCreateRecordingSession()
回呼觸發時傳回該子類別。這個子類別負責切換正確的管道資料、記錄要求的資料,以及將記錄狀態和錯誤傳送到系統。
當系統呼叫 RecordingSession.onTune()
並傳入管道 URI 時,請調整至 URI 指定的管道。呼叫 notifyTuned()
,告知系統應用程式已調整至所需版本;如果應用程式無法轉到正確的管道,請呼叫 notifyError()
。
系統接著會叫用 RecordingSession.onStartRecording()
回呼。您的應用程式必須立即開始錄製。當系統叫用這個回呼時,可能會提供 URI,其中包含即將記錄的程式資訊。記錄完成後,請將此資料複製到 RecordedPrograms
資料表。
最後,系統會呼叫 RecordingSession.onStopRecording()
。此時,應用程式必須立即停止錄製。您也需要在 RecordedPrograms
資料表中建立項目,其中包含 RecordedPrograms.COLUMN_RECORDING_DATA_URI
欄中的記錄工作階段資料 URI,以及系統在初始呼叫 onStartRecording()
中提供的任何程式資訊。
如要進一步瞭解如何存取 RecordedPrograms
資料表,請參閱「管理記錄的工作階段」一節。
處理錄製錯誤
如果記錄期間發生錯誤,導致記錄資料無法使用,請呼叫 notifyError()
來通知系統。您也可以在建立錄製工作階段後呼叫 notifyError()
,讓系統知道應用程式無法再錄製工作階段。
如果錄製期間發生錯誤,但您想為使用者提供部分錄音檔進行播放,請呼叫 notifyRecordingStopped()
以讓系統使用部分工作階段。
管理錄製的工作階段
針對來自 RecordedPrograms
內容供應器資料表中,所有可錄製的管道應用程式,系統會維護所有錄製工作階段的資訊。您可以透過 RecordedPrograms
內容記錄 URI 存取這項資訊。使用內容供應器 API 讀取、新增及刪除這個資料表中的項目。
如要進一步瞭解如何使用內容供應器資料,請參閱「 內容供應器基礎知識」。
最佳做法
電視裝置的儲存空間可能有限,因此在分配儲存空間以節省錄影工作階段時,請自行斟酌。如果空間不足以儲存錄製的工作階段,請使用 RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
。
使用者啟動錄製程序時,請盡快開始記錄資料。為促進這種情況,請在系統叫用 onCreateRecordingSession()
回呼時,完成所有耗時的工作,例如存取及分配儲存空間。這樣做可讓您在 onStartRecording()
回呼觸發時,立即開始錄製。