Compatibilidad con la grabación de contenido

Los servicios de entrada de TV permiten al usuario pausar y reanudar la reproducción de canales por medio de las API de time-shifting. Android 7.0 amplia las funciones de time-shifting al permitirle al usuario guardar varias sesiones grabadas.

Los usuarios pueden programar las grabaciones con anticipación o comenzar a grabar cuando están mirando un programa. Una vez que el sistema haya guardado una grabación, el usuario puede explorarla, administrarla y reproducirla por medio de la app para TV del sistema.

Si deseas proporcionar funcionalidades de grabación para tu servicio de entrada de TV, debes indicarle al sistema que tu app admite la grabación, implementar la capacidad para grabar programas, controlar y comunicar los errores que puedan producirse.

Cómo indicar la compatibilidad con la grabación

Para indicarle al sistema que tu servicio de entrada de TV admite la grabación, debes establecer el atributo android:canRecord de tu archivo XML de metadatos de servicio en 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.

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

  1. En el método onCreate() de tu servicio de entrada de TV, crea un nuevos objeto TvInputInfo con 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 es compatible con la grabación.
  3. Registra tu objeto TvInputInfo en el sistema al llamar a TvInputManager.updateTvInputInfo().

Cómo grabar una sesión

Una vez 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 se encarga 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 transmita un URI de canal), sintoniza el canal que se especifica en el URI. Notifica al sistema que tu app sintonizó el canal deseado al llamar notifyTuned() o, si no pudo sintonizar el canal correcto, llama a notifyError().

A continuación, el sistema invoca la devolución de llamada RecordingSession.onStartRecording(), así que tu app debe comenzar a grabar inmediatamente. Cuando el sistema invoca esta devolución de llamada, puede brindar un URI que contiene información sobre el programa que se está por grabar. Una vez que se grabe, tendrás que copiar 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 inmediatamente. Además, debes crear una entrada en la tabla RecordedPrograms. Esta entrada debe incluir el URI de datos de la sesión grabada en la columna RecordedPrograms.COLUMN_RECORDING_DATA_URI y cualquier otro dato que haya proporcionado el sistema en la llamada inicial a onStartRecording().

Para obtener más detalles sobre cómo acceder a la tabla RecordedPrograms, consulta Cómo administrar las sesiones grabadas.

Cómo controlar los errores de grabación

Si se produce algún error durante la grabación, que hace que los datos de esta no puedan usarse, debes notificar al sistema mediante una llamada a notifyError(). De manera similar, puedes llamar a notifyError() luego de crear una sesión de grabación para indicarle 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 canales con funcionalidad de grabación en la tabla del proveedor de contenido RecordedPrograms. Se puede acceder a esta información por medio de los URI de grabación de contenido RecordedPrograms. Usa las API del proveedor de contenido para leer, agregar y borrar entradas en esta tabla.

Para obtener más información sobre cómo trabajar con datos del proveedor de contenido, consulta Aspectos básicos sobre el proveedor 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 suficiente espacio para guardar una sesión grabada.

Cuando el usuario inicie la grabación, debes empezar a grabar los datos lo antes posible. Para facilitar este proceso, completa cualquier tarea que consuma mucho tiempo con anticipación, 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().