支持内容录制

电视输入服务允许用户使用时间推移 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()回调触发时立即开始录制。