Compatibilité avec l'enregistrement de contenu

Les services d'entrée TV permettent à l'utilisateur de mettre en pause et de reprendre la lecture d'une chaîne à l'aide d'API de décalage temporel. Android 7.0 étend le décalage temporel en permettant à l'utilisateur de sauvegarder plusieurs sessions enregistrées.

Les utilisateurs peuvent programmer des enregistrements à l'avance ou en démarrer un pendant qu'ils regardent un programme. Une fois que le système a enregistré un enregistrement, l'utilisateur peut le parcourir, le gérer et le lire à l'aide de l'application TV du système.

Si vous souhaitez fournir une fonctionnalité d'enregistrement pour votre service d'entrée TV, vous devez indiquer au système que votre application prend en charge l'enregistrement, mettre en œuvre la possibilité d'enregistrer des programmes, gérer et communiquer les erreurs qui se produisent pendant l'enregistrement, et gérer vos sessions enregistrées.

Indiquer la prise en charge de l'enregistrement

Pour indiquer au système que votre service d'entrée TV prend en charge l'enregistrement, définissez l'attribut android:canRecord dans le fichier XML de métadonnées de votre service sur true:

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

Pour en savoir plus sur le fichier de métadonnées du service, consultez la section Déclarer votre service d'entrée TV dans le fichier manifeste.

Vous pouvez également indiquer la prise en charge de l'enregistrement dans votre code en procédant comme suit:

  1. Dans la méthode onCreate() de votre service d'entrée TV, créez un objet TvInputInfo à l'aide de la classe TvInputInfo.Builder.
  2. Lors de la création du nouvel objet TvInputInfo, appelez setCanRecord(true) avant d'appeler build() pour indiquer que votre service prend en charge l'enregistrement.
  3. Enregistrez votre objet TvInputInfo auprès du système en appelant TvInputManager.updateTvInputInfo().

Enregistrer une session

Une fois que votre service d'entrée TV a indiqué qu'il prend en charge la fonctionnalité d'enregistrement, le système appelle votre méthode TvInputService.onCreateRecordingSession() lorsqu'il doit accéder à l'implémentation de l'enregistrement de votre application. Implémentez votre propre sous-classe TvInputService.RecordingSession et renvoyez-la lorsque le rappel onCreateRecordingSession() se déclenche. Cette sous-classe est chargée de basculer vers les données de canal correctes, d'enregistrer les données demandées et de communiquer l'état d'enregistrement et les erreurs au système.

Lorsque le système appelle RecordingSession.onTune() en transmettant un URI de canal, sélectionnez le canal spécifié par l'URI. Informez le système que votre application s'est connectée sur la chaîne souhaitée en appelant notifyTuned() ou, si votre application ne parvient pas à se connecter au canal approprié, appelez notifyError().

Le système appelle ensuite le rappel RecordingSession.onStartRecording(). Votre application doit commencer à enregistrer immédiatement. Lorsque le système appelle ce rappel, il peut fournir un URI contenant des informations sur le programme sur le point d'être enregistré. Une fois l'enregistrement terminé, copiez ces données dans la table de données RecordedPrograms.

Enfin, le système appelle RecordingSession.onStopRecording(). À ce stade, votre application doit immédiatement arrêter l'enregistrement. Vous devez également créer une entrée dans la table RecordedPrograms qui inclut l'URI de données de session enregistré dans la colonne RecordedPrograms.COLUMN_RECORDING_DATA_URI, ainsi que toutes les informations sur le programme fournies par le système lors de l'appel initial à onStartRecording().

Pour savoir comment accéder à la table RecordedPrograms, consultez la section Gérer les sessions enregistrées.

Gérer les erreurs d'enregistrement

Si une erreur se produit pendant l'enregistrement, entraînant des données enregistrées inutilisables, informez le système en appelant notifyError(). Vous pouvez également appeler notifyError() après la création d'une session d'enregistrement pour indiquer au système que votre application ne peut plus enregistrer de sessions.

Si une erreur se produit pendant l'enregistrement, mais que vous souhaitez fournir un enregistrement partiel aux utilisateurs pour la lecture, appelez notifyRecordingStopped() pour permettre au système d'utiliser la session partielle.

Gérer les sessions enregistrées

Le système conserve les informations pour toutes les sessions enregistrées de toutes les applications de canaux compatibles avec l'enregistrement dans la table du fournisseur de contenu RecordedPrograms. Ces informations sont accessibles via les URI d'enregistrement de contenu RecordedPrograms. Utilisez les API des fournisseurs de contenu pour lire, ajouter et supprimer des entrées de cette table.

Pour en savoir plus sur l'utilisation des données des fournisseurs de contenu, consultez Principes de base des fournisseurs de contenu.

Bonnes pratiques

Les téléviseurs peuvent avoir un espace de stockage limité. Par conséquent, faites appel à votre bon sens lorsque vous allouez de l'espace pour sauvegarder les sessions enregistrées. Utilisez RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE) lorsque l'espace est insuffisant pour enregistrer une session enregistrée.

Lorsque l'utilisateur lance l'enregistrement, commencez à enregistrer les données dès que possible. Pour ce faire, effectuez toutes les tâches initiales chronophages, telles que l'accès à l'espace de stockage et l'allocation de cet espace, lorsque le système appelle le rappel onCreateRecordingSession(). Cela vous permet de commencer l'enregistrement immédiatement lorsque le rappel onStartRecording() se déclenche.