支持内容录制

借助 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 输入服务

或者,您也可以执行以下步骤,在代码中指明支持录制:

  1. 在 TV 输入服务 onCreate() 方法中,使用 TvInputInfo.Builder 类创建一个新的 TvInputInfo 对象。
  2. 创建新的 TvInputInfo 对象时,请先调用 setCanRecord(true),然后再调用 build(),以指明您的服务支持录制。
  3. 通过调用 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 访问。使用 content provider API 可以读取、添加和删除此表中的条目。

如需详细了解如何使用 content provider 数据,请参阅 content provider 基础知识

最佳实践

TV 设备的存储空间可能有限,因此在分配存储空间以保存录制的会话时,请运用您的最佳判断。如果没有足够的空间来保存录制的会话,请使用 RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)

当用户发起录制时,应尽快开始录制数据。为了方便起见,请在系统调用 onCreateRecordingSession() 回调时完成前期的所有耗时任务,例如访问和分配存储空间。这样做让您能够在触发 onStartRecording() 回调时立即开始录制。