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()
回调触发时返回它。此子类负责切换到正确的频道数据,录制请求的数据,并将录制状态和错误传达给系统。
当系统调用 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()
回调触发时立即开始录制。