電視輸入服務可讓使用者使用時光平移 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()
回呼觸發時立即開始錄製。