Compatibilidad con la grabación de contenido

Los servicios de entrada de TV permiten al usuario pausar y reanudar la reproducción de canales mediante las APIs de time-shifting. Android 7.0 expande la función de pausa en directo, ya que permite que los usuarios guarden varias sesiones grabadas.

Los usuarios pueden programar las grabaciones con anticipación o comenzar a grabar mientras miran un programa. Una vez que el sistema guarda una grabación, el usuario puede explorarla, administrarla y reproducirla con la app de TV del sistema.

Si deseas proporcionar una funcionalidad de grabación para tu servicio de entrada de TV, debes indicar al sistema que tu app admite la grabación, implementar la capacidad de grabar programas, manejar y comunicar cualquier error que ocurra durante la grabación, y administrar las sesiones grabadas.

Cómo indicar la compatibilidad con la grabación

Para indicarle al sistema que tu servicio de entrada de TV admite la grabación, establece el atributo android:canRecord en tu archivo XML de metadatos de servicio como true:

<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
  android:canRecord="true"
  android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" />

Para obtener más información sobre el archivo de metadatos de servicio, consulta Cómo declarar tu servicio de entrada de TV en el manifiesto.

Como alternativa, puedes indicar la compatibilidad con la grabación en tu código; para ello, sigue estos pasos:

  1. En el método onCreate() del servicio de entrada de TV, crea un nuevo objeto TvInputInfo mediante la clase TvInputInfo.Builder.
  2. Cuando crees el nuevo objeto TvInputInfo, llama a setCanRecord(true) antes de llamar a build() para indicar que tu servicio admite la grabación.
  3. Registra tu objeto TvInputInfo con el sistema llamando a TvInputManager.updateTvInputInfo().

Cómo grabar una sesión

Después de que tu servicio de entrada de TV registre que admite la funcionalidad de grabación, el sistema llamará a tu método TvInputService.onCreateRecordingSession() cuando necesite acceder a la implementación de grabación de tu app. Implementa tu propia subclase TvInputService.RecordingSession y muéstrala cuando se active la devolución de llamada onCreateRecordingSession(). Esta subclase es responsable de cambiar a los datos del canal correcto, grabar los datos solicitados y comunicar el estado y los errores de grabación al sistema.

Cuando el sistema llame a RecordingSession.onTune() y pasa un URI de canal, sintoniza el canal que se especifica en el URI. Llama a notifyTuned() para notificar al sistema que tu app se sintonizó en el canal deseado o, si no puede sintonizarse en el canal correcto, llama a notifyError().

A continuación, el sistema invoca la devolución de llamada RecordingSession.onStartRecording(). La app debe comenzar a grabar de inmediato. Cuando el sistema invoca esta devolución de llamada, es posible que proporcione un URI que contenga información sobre el programa que se está por grabar. Cuando la grabación finalice, copia estos datos en la tabla de datos RecordedPrograms.

Por último, el sistema llama a RecordingSession.onStopRecording(). En este punto, tu app debe dejar de grabar de inmediato. También debes crear una entrada en la tabla RecordedPrograms que incluya el URI de los datos de la sesión registrada en la columna RecordedPrograms.COLUMN_RECORDING_DATA_URI y cualquier información del programa que el sistema proporcionó en la llamada inicial a onStartRecording().

Si quieres obtener más detalles para acceder a la tabla RecordedPrograms, consulta la sección Cómo administrar las sesiones grabadas.

Cómo resolver los errores de grabación

Si se produce un error durante la grabación que hace que los datos grabados no se puedan usar, llama a notifyError() para notificar al sistema. También puedes llamar a notifyError() después de crear una sesión de grabación para informarle al sistema que tu app ya no puede grabar sesiones.

Si se produce un error durante la grabación, pero deseas brindar a los usuarios una grabación parcial para reproducir, llama a notifyRecordingStopped() a fin de permitir que el sistema use la sesión parcial.

Cómo administrar sesiones grabadas

El sistema mantiene información de todas las sesiones grabadas de todas las apps de canal con funcionalidad de grabación en la tabla del proveedor de contenido RecordedPrograms. Se puede acceder a esta información a través de los URI de grabación de contenido de RecordedPrograms. Usa las APIs de proveedor de contenido para leer, agregar y borrar entradas de esta tabla.

Para obtener más información sobre cómo trabajar con datos del proveedor de contenido, consulta Conceptos básicos sobre los proveedores de contenido.

Prácticas recomendadas

Es posible que los dispositivos de TV tengan almacenamiento limitado, por lo que debes ser cuidadoso a la hora de asignar el almacenamiento para guardar las sesiones grabadas. Usa RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE) cuando no haya espacio suficiente para guardar una sesión grabada.

Cuando el usuario inicie la grabación, comienza a registrar los datos lo antes posible. Para facilitar este proceso, completa cualquier tarea anticipada que requiera mucho tiempo, como acceder y asignar espacio de almacenamiento, cuando el sistema invoque la devolución de llamada onCreateRecordingSession(). De esta manera, podrás comenzar a grabar inmediatamente después de que se active la devolución de llamada onStartRecording().