支持内容录制

电视输入服务允许用户使用时移 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" />

有关服务元数据文件的更多信息,请参阅在清单中声明您的电视输入服务

或者,您可以使用以下步骤在代码中表明支持录制

  1. 在电视输入服务 onCreate() 方法中,使用 TvInputInfo.Builder 类创建一个新的 TvInputInfo 对象。
  2. 创建新的 TvInputInfo 对象时,在调用 build() 之前调用 setCanRecord(true) 以表明您的服务支持录制。
  3. 通过调用 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() 回调触发时立即开始录制。