TV 输入服务允许用户通过时移 API 暂停和继续频道播放。Android 7.0 通过允许用户保存多个录制的会话,扩展了时移。
用户可以提前安排录制,或在观看节目时开始录制。系统保存录制内容后,用户可使用系统 TV 应用来浏览、管理和播放该录制内容。
如果要为 TV 输入服务提供录制功能,您必须向系统指明您的应用支持录制,实现录制节目的功能,处理和传达录制期间发生的所有错误,并管理录制的会话。
指明支持录制
如需告知系统您的 TV 输入服务支持录制,请将您的服务元数据 XML 文件中的 android:canRecord
属性设置为 true
:
<tv-input xmlns:android="http://schemas.android.com/apk/res/android" android:canRecord="true" android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" />
如需详细了解服务元数据文件,请参阅在清单中声明您的 TV 输入服务。
或者,您也可以执行以下步骤,在您的代码中指明支持录制:
- 在 TV 输入服务
onCreate()
方法中,使用TvInputInfo.Builder
类创建一个新的TvInputInfo
对象。 - 创建新的
TvInputInfo
对象时,在调用build()
之前先调用setCanRecord(true)
,以指明您的服务支持录制。 - 通过调用
TvInputManager.updateTvInputInfo()
在系统中注册TvInputInfo
对象。
录制会话
TV 输入服务注册其支持录制功能后,系统会在需要访问应用的录制实现时调用 TvInputService.onCreateRecordingSession()
方法。实现您自己的 TvInputService.RecordingSession
子类并在触发 onCreateRecordingSession()
回调后返回它。此子类负责切换到正确的频道数据,录制请求的数据,以及向系统传达录制状态和错误。
系统调用在频道 URI 中传递的 RecordingSession.onTune()
时,将调到该 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 读取、添加和删除此表中的条目。
如需详细了解如何使用内容提供程序数据,请参阅内容提供程序基础知识。
最佳做法
TV 设备的存储空间可能有限,因此在分配存储空间以保存录制的会话时,请做出最佳判断。如果没有足够的空间存储录制的会话,请使用 RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
。
当用户发起录制时,您应尽快开始录制数据。为便于执行此操作,请在系统调用 onCreateRecordingSession()
回调时完成前期的所有耗时任务,如访问和分配存储空间。这样做可让您在 onStartRecording()
回调触发后立即开始录制。