Register now for Android Dev Summit 2019!

支持内容录制

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 对象时,在调用 build() 之前先调用 setCanRecord(true),以表明您的服务支持录制。
  3. 通过调用 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 来读取、添加和删除此表中的条目。

如需详细了解如何使用内容提供程序数据,请参阅内容提供程序基础知识

最佳做法

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

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