Rendre une application Android TV compatible Cast

1. Présentation

Logo Google Cast

Cet atelier de programmation vous explique comment modifier une application Android TV existante pour permettre le casting et la communication à partir de vos applications émettrices Cast existantes.

Présentation de Google Cast et de Cast Connect

Google Cast permet aux utilisateurs de caster des contenus depuis un appareil mobile sur un téléviseur. Une session Google Cast comprend généralement deux composants : une application émettrice et une application réceptrice. Les applications émettrices, telles qu'une application mobile ou un site Web comme youtube.com, lancent et contrôlent la lecture d'une application réceptrice. Les applications réceptrices Google Cast sont des applications HTML5 qui s'exécutent sur des appareils Chromecast et Android TV.

La quasi-intégralité de l'état d'une session Cast est stockée dans l'application réceptrice. Lors de la mise à jour de l'état, par exemple si un nouvel élément multimédia est chargé, un état du contenu multimédia est diffusé vers tous les émetteurs. Ces annonces contiennent l'état actuel de la session Cast. Les applications émettrices utilisent cet état de contenu multimédia pour afficher des informations de lecture dans leur interface utilisateur.

Cast Connect s'appuie sur cette infrastructure où votre application Android TV joue le rôle de récepteur. La bibliothèque Cast Connect permet à l'application Android TV de recevoir des messages et de diffuser l'état d'un contenu multimédia comme s'il s'agissait d'une application réceptrice Cast.

Qu'allons-nous créer ?

Lorsque vous aurez terminé cet atelier de programmation, vous pourrez utiliser des applications émettrices Cast pour caster des vidéos vers une application Android TV. L'application Android TV peut également communiquer avec les applications émettrices via le protocole Cast.

Points abordés

  • Ajouter la bibliothèque Cast Connect à un exemple d'application Android TV.
  • Connecter une application émettrice Cast et lancer l'application Android TV.
  • Lancer la lecture d'un contenu multimédia dans l'application Android TV via l'application émettrice Cast.
  • Comment envoyer l'état d'un contenu multimédia depuis l'application Android TV vers les applications émettrices Cast.

Prérequis

2. Obtenir l'exemple de code

Vous pouvez télécharger tout l'exemple de code sur votre ordinateur…

puis décompresser le fichier ZIP téléchargé.

3. Exécuter l'application exemple

Voyons d'abord comment se présente notre exemple d'application une fois terminée. L'application Android TV utilise l'interface utilisateur Leanback et un lecteur vidéo basique. L'utilisateur peut sélectionner une vidéo dans une liste pour en lancer la lecture sur le téléviseur. Grâce à l'application mobile émettrice associée, un utilisateur peut également caster une vidéo sur l'application Android TV.

Image d'une série de miniatures de vidéos (dont l'une est mise en surbrillance) superposées à un aperçu d'une vidéo en plein écran. Les mots "Cast Connect" apparaissent en haut à droite.

Enregistrer des appareils de développeur

Pour activer les fonctionnalités de Cast Connect pour le développement d'applications, vous devez enregistrer le numéro de série du Chromecast intégré à l'appareil Android TV que vous utiliserez dans la console de développement Cast. Pour trouver ce numéro de série, accédez à Paramètres > Préférences relatives aux appareils > Chromecast Intégré > Numéro de série sur votre Android TV. Notez que ce numéro est différent du numéro de série de votre appareil physique et peut uniquement être obtenu à l'aide de la méthode décrite ci-dessus.

Image d'un écran Android TV affichant l'écran "Chromecast intégré", le numéro de version et le numéro de série

Si l'enregistrement n'est pas effectué, Cast Connect ne fonctionnera que pour les applications installées depuis le Google Play Store pour des raisons de sécurité. Redémarrez l'appareil 15 minutes après le lancement du processus d'enregistrement.

Installer l'application émettrice Android

Pour tester les demandes d'émission depuis un appareil mobile, nous mettons à votre disposition une application émettrice simple appelée Cast Videos au format mobile-sender-0629.apk dans le fichier ZIP du code source. Nous allons utiliser ADB pour installer cet APK. Si vous avez déjà installé une autre version de Cast Videos, veuillez la désinstaller de tous les profils hébergés par l'appareil avant de continuer.

  1. Activez les options pour les développeurs et le débogage USB sur votre téléphone Android.
  2. Branchez un câble de données USB pour connecter votre téléphone Android à votre ordinateur de développement.
  3. Installez mobile-sender-0629.apk sur votre téléphone Android.

Image d'une fenêtre de terminal exécutant la commande adb install pour installer mobile-sender.apk

  1. L'application émettrice Cast Videos se trouve sur votre téléphone Android. Icône de l'application Cast Videos

Image de l'application émettrice Cast Videos exécutée sur l'écran d'un téléphone Android

Installer l'application Android TV

Les instructions ci-dessous décrivent comment ouvrir et exécuter l'exemple d'application terminée dans Android Studio :

  1. Sélectionnez Import Project (Importer un projet) sur l'écran d'accueil ou passez par les options du menu File > New > Import Project… (Fichier > Nouveau > Importer un projet…).
  2. Sélectionnez le répertoire Icône Dossierapp-done dans le dossier de l'exemple de code, puis cliquez sur "OK".
  3. Cliquez sur File (Fichier) > Bouton "Synchroniser le projet avec Gradle" d'Android App Studio Sync Project with Gradle Files (Synchroniser le projet avec les fichiers Gradle).
  4. Activez les options pour les développeurs et le débogage USB sur votre appareil Android TV.
  5. Effectuez la connexion ADB à votre appareil Android TV. Il doit s'afficher dans Android Studio. Image montrant l'appareil Android TV dans la barre d'outils d'Android Studio
  6. Cliquez sur le bouton Bouton Run (Exécuter) d'Android Studio (triangle vert orienté vers la droite)Run (Exécuter). L'application Android TV Cast Connect Codelab devrait apparaître après quelques secondes.

Utiliser l'application Cast Connect pour Android TV

  1. Accédez à l'écran d'accueil Android TV.
  2. Ouvrez l'application émettrice Cast Videos sur votre téléphone Android. Cliquez sur l'icône Cast Icône du bouton Cast, puis sélectionnez votre appareil Android TV.
  3. L'application Cast Connect Codelab Android TV est lancée sur votre téléviseur Android TV, et l'icône Cast de votre application émettrice indique qu'elle est connectéeIcône du bouton Cast avec des couleurs inversées.
  4. Sélectionnez une vidéo dans l'application Android TV pour en lancer la lecture sur votre téléviseur.
  5. Sur votre téléphone mobile, une mini télécommande s'affiche désormais à la base de l'application émettrice. Vous pouvez utiliser le bouton Lecture/Pause pour contrôler la lecture.
  6. Sélectionnez une vidéo sur le téléphone mobile, puis lancez sa lecture. La lecture de la vidéo commence sur votre téléviseur Android TV, et votre télécommande s'affiche sur votre émetteur mobile.
  7. Verrouillez votre téléphone, puis déverrouillez-le : une notification vous permettant de contrôler la lecture du contenu multimédia ou d'arrêter la diffusion devrait maintenant apparaître sur l'écran de verrouillage.

Image d'une section de l'écran d'un téléphone Android avec un minilecteur diffusant une vidéo

4. Préparer le projet de départ

Maintenant que nous avons vérifié que l'intégration de Cast Connect dans l'application était effectuée, il nous reste à ajouter la compatibilité avec Cast Connect sur l'application de démarrage que vous avez téléchargée. Vous voici prêt à poursuivre le développement du projet de départ en utilisant Android Studio :

  1. Sélectionnez Import Project (Importer un projet) sur l'écran d'accueil ou les options de menu File > New > Import Project (Fichier > Nouveau > Importer un projet).
  2. Sélectionnez le répertoire Icône Dossierapp-start dans le dossier de l'exemple de code, puis cliquez sur OK.
  3. Cliquez sur File (Fichier) > Bouton "Sync Project with Gradle" (Synchroniser le projet avec Gradle) d'Android Studio Sync Project with Gradle Files (Synchroniser le projet avec les fichiers Gradle).
  4. Sélectionnez un appareil Android TV, puis cliquez sur le bouton Bouton "Run" (Exécuter) d'Android Studio (triangle vert pointant vers la droite)Run (Exécuter) pour exécuter l'application et explorer l'interface utilisateur. Barre d'outils Android Studio montrant l'appareil Android TV sélectionné

Image d'une série de miniatures de vidéos (dont l'une est mise en surbrillance) superposées à un aperçu d'une vidéo en plein écran. Les mots "Cast Connect" apparaissent en haut à droite.

Conception d'applications

L'application fournit une liste de vidéos que l'utilisateur peut parcourir. Les utilisateurs peuvent sélectionner une vidéo à lire sur l'appareil Android TV. L'application peut effectuer deux activités principales : MainActivity et PlaybackActivity.

MainActivity

Cette activité contient un fragment (MainFragment). La liste des vidéos et leurs métadonnées associées sont configurées dans la classe MovieList, tandis que la méthode setupMovies() est appelée pour créer une liste d'objets Movie.

Un objet Movie représente une entité vidéo avec un titre, une description, des vignettes et une URL de vidéo. Chaque objet Movie est associé à un CardPresenter pour présenter la vignette vidéo avec le titre et le producteur, puis transmis à ArrayObjectAdapter.

Lorsqu'un élément est sélectionné, l'objet Movie correspondant est transmis à l'activité PlaybackActivity.

PlaybackActivity

Cette activité contient un fragment (PlaybackVideoFragment) qui héberge une classe VideoView avec le lecteur ExoPlayer, des contrôles multimédias et une zone de texte pour afficher la description de la vidéo sélectionnée et permettre à l'utilisateur de lire la vidéo sur l'appareil Android TV. La télécommande permet de lire/mettre en pause une vidéo ou de chercher un niveau d'avancement dans sa lecture.

Conditions préalables pour Cast Connect

Cast Connect utilise de nouvelles versions des services Google Play nécessitant la mise à jour de votre application Android TV pour utiliser l'espace de noms AndroidX.

Pour utiliser Cast Connect dans votre application Android TV, vous devez créer et gérer des événements à partir d'une session multimédia. La bibliothèque Cast Connect génère des états de contenus multimédias basés sur l'état de la session multimédia. Votre session multimédia est également utilisée par la bibliothèque Cast Connect pour signaler l'arrivée de certains messages d'un émetteur, comme une mise en pause.

5. Configurer la compatibilité Cast

Dépendances

Mettez à jour le fichier build.gradle de l'application afin d'inclure les dépendances de bibliothèque requises :

dependencies {
    ....

    // Cast Connect libraries
    implementation 'com.google.android.gms:play-services-cast-tv:20.0.0'
    implementation 'com.google.android.gms:play-services-cast:21.1.0'
}

Synchronisez le projet pour vérifier qu'il ne comporte aucune erreur.

Initialisation

CastReceiverContext est un objet singleton permettant de coordonner toutes les interactions Cast. Vous devez mettre en œuvre l'interface ReceiverOptionsProvider pour fournir les options CastReceiverOptions lors de l'initialisation de CastReceiverContext.

Créez le fichier CastReceiverOptionsProvider.kt, puis ajoutez la classe suivante au projet :

package com.google.sample.cast.castconnect

import android.content.Context
import com.google.android.gms.cast.tv.ReceiverOptionsProvider
import com.google.android.gms.cast.tv.CastReceiverOptions

class CastReceiverOptionsProvider : ReceiverOptionsProvider {
    override fun getOptions(context: Context): CastReceiverOptions {
        return CastReceiverOptions.Builder(context)
                .setStatusText("Cast Connect Codelab")
                .build()
    }
}

Indiquez ensuite la source des options du récepteur dans la balise <application> du fichier AndroidManifest.xml de l'application :

<application>
  ...
  <meta-data
    android:name="com.google.android.gms.cast.tv.RECEIVER_OPTIONS_PROVIDER_CLASS_NAME"
    android:value="com.google.sample.cast.castconnect.CastReceiverOptionsProvider" />
</application>

Pour vous connecter à votre application Android TV via l'émetteur Cast, sélectionnez l'activité à lancer. Dans cet atelier de programmation, nous lancerons l'MainActivity de l'application lors du démarrage d'une session Cast. Dans le fichier AndroidManifest.xml, ajoutez le filtre d'intent de lancement de l'activité MainActivity.

<activity android:name=".MainActivity">
  ...
  <intent-filter>
    <action android:name="com.google.android.gms.cast.tv.action.LAUNCH" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Cycle de vie d'un contexte du récepteur Cast

Vous devez démarrer le contexte CastReceiverContext lorsque votre application est lancée, puis arrêter ce contexte CastReceiverContext lorsque l'application passe à l'arrière-plan. Nous vous recommandons d'utiliser l'élément LifecycleObserver de la bibliothèque androidx.lifecycle pour gérer les appels de CastReceiverContext.start() et de CastReceiverContext.stop().

Ouvrez le fichier MyApplication.kt, initialisez le contexte de diffusion en appelant initInstance() dans la méthode onCreate de l'application. Dans la classe AppLifeCycleObserver, utilisez start() sur CastReceiverContext lorsque l'application est réactivée et stop() lorsque l'application est mise en pause :

package com.google.sample.cast.castconnect

import com.google.android.gms.cast.tv.CastReceiverContext
...

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        CastReceiverContext.initInstance(this)
        ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
    }

    class AppLifecycleObserver : DefaultLifecycleObserver {
        override fun onResume(owner: LifecycleOwner) {
            Log.d(LOG_TAG, "onResume")
            CastReceiverContext.getInstance().start()
        }

        override fun onPause(owner: LifecycleOwner) {
            Log.d(LOG_TAG, "onPause")
            CastReceiverContext.getInstance().stop()
        }
    }
}

Connecter MediaSession à MediaManager

MediaManager est une propriété du singleton CastReceiverContext, elle gère l'état du contenu multimédia et l'intent de chargement, convertit les messages de l'espace de noms multimédia des émetteurs en commandes multimédias et renvoie l'état du contenu multimédia aux émetteurs.

Lorsque vous créez une propriété MediaSession, vous devez également fournir le jeton MediaSession actuel à MediaManager afin de lui indiquer où envoyer les commandes et récupérer l'état de la lecture du contenu multimédia. Dans le fichier PlaybackVideoFragment.kt, assurez-vous que MediaSession est initialisé avant de définir le jeton sur MediaManager.

import com.google.android.gms.cast.tv.CastReceiverContext
import com.google.android.gms.cast.tv.media.MediaManager
...

class PlaybackVideoFragment : VideoSupportFragment() {
    private var castReceiverContext: CastReceiverContext? = null
    ...

    private fun initializePlayer() {
        if (mPlayer == null) {
            ...
            mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
            ...
            castReceiverContext = CastReceiverContext.getInstance()
            if (castReceiverContext != null) {
                val mediaManager: MediaManager = castReceiverContext!!.getMediaManager()
                mediaManager.setSessionCompatToken(mMediaSession!!.getSessionToken())
            }

        }
    }
}

Lorsque vous n'utilisez plus la propriété MediaSession pour des raisons d'inactivité, nous vous conseillons de définir un jeton nul sur MediaManager :

private fun releasePlayer() {
    mMediaSession?.release()
    castReceiverContext?.mediaManager?.setSessionCompatToken(null)
    ...
}

Exécuter l'exemple d'application

Cliquez sur le bouton Bouton &quot;Run&quot; (Exécuter) d&#39;Android Studio (triangle vert pointant vers la droite)Run (Exécuter) pour déployer l'application sur votre appareil Android TV, fermez-la et revenez à l'écran d'accueil d'Android TV. Depuis l'émetteur, cliquez sur l'icône Cast Icône du bouton Cast, puis sélectionnez votre appareil Android TV. L'application Android TV s'affiche sur l'appareil, et l'icône Cast affiche l'état connecté.

6. Charger un contenu multimédia

La commande de chargement est envoyée via un intent avec le nom de package que vous avez défini dans la console de développement. Pour spécifier l'activité cible qui recevra cet intent, vous devez ajouter le filtre d'intent prédéfini suivant dans votre application Android TV. Dans le fichier AndroidManifest.xml, ajoutez le filtre d'intent de chargement à PlayerActivity :

<activity android:name="com.google.sample.cast.castconnect.PlaybackActivity"
          android:launchMode="singleTask"
          android:exported="true">
  <intent-filter>
     <action android:name="com.google.android.gms.cast.tv.action.LOAD"/>
     <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Gérer les requêtes de chargement sur Android TV

Maintenant que l'activité est configurée pour recevoir cet intent contenant une requête de chargement, nous devons gérer cette action.

L'application appelle une méthode privée appelée processIntent lorsque l'activité démarre. Cette méthode contient la structure de traitement des intents reçus. Pour gérer une requête de chargement, nous allons modifier cette méthode et envoyer l'intent pour un traitement supplémentaire en appelant la méthode onNewIntent de l'instance MediaManager. Si MediaManager détecte que l'intent est une requête de chargement, il extrait l'objet MediaLoadRequestData de l'intent et appelle MediaLoadCommandCallback.onLoad(). Modifiez la méthode processIntent dans le fichier PlaybackVideoFragment.kt pour gérer l'intent contenant la requête de chargement:

fun processIntent(intent: Intent?) {
    val mediaManager: MediaManager = CastReceiverContext.getInstance().getMediaManager()
    // Pass intent to Cast SDK
    if (mediaManager.onNewIntent(intent)) {
        return
    }

    // Clears all overrides in the modifier.
    mediaManager.getMediaStatusModifier().clear()

    // If the SDK doesn't recognize the intent, handle the intent with your own logic.
    ...
}

Nous allons ensuite étendre la classe abstraite MediaLoadCommandCallback, qui va remplacer la méthode onLoad() appelée par MediaManager. Cette méthode reçoit les données de la requête de chargement et les convertit en objet Movie. Une fois converti, le film est lu par le lecteur local. Le MediaManager est ensuite mis à jour avec MediaLoadRequest et diffuse l'état MediaStatus aux émetteurs connectés. Créez une classe privée imbriquée appelée MyMediaLoadCommandCallback dans le fichier PlaybackVideoFragment.kt:

import com.google.android.gms.cast.MediaLoadRequestData
import com.google.android.gms.cast.MediaInfo
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.cast.MediaError
import com.google.android.gms.cast.tv.media.MediaException
import com.google.android.gms.cast.tv.media.MediaCommandCallback
import com.google.android.gms.cast.tv.media.QueueUpdateRequestData
import com.google.android.gms.cast.tv.media.MediaLoadCommandCallback
import com.google.android.gms.tasks.Task
import com.google.android.gms.tasks.Tasks
import android.widget.Toast
...

private inner class MyMediaLoadCommandCallback :  MediaLoadCommandCallback() {
    override fun onLoad(
        senderId: String?, mediaLoadRequestData: MediaLoadRequestData): Task<MediaLoadRequestData> {
        Toast.makeText(activity, "onLoad()", Toast.LENGTH_SHORT).show()
        return if (mediaLoadRequestData == null) {
            // Throw MediaException to indicate load failure.
            Tasks.forException(MediaException(
                MediaError.Builder()
                    .setDetailedErrorCode(MediaError.DetailedErrorCode.LOAD_FAILED)
                    .setReason(MediaError.ERROR_REASON_INVALID_REQUEST)
                    .build()))
        } else Tasks.call {
            play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
            // Update media metadata and state
            val mediaManager = castReceiverContext!!.mediaManager
            mediaManager.setDataFromLoad(mediaLoadRequestData)
            mediaLoadRequestData
        }
    }
}

private fun convertLoadRequestToMovie(mediaLoadRequestData: MediaLoadRequestData?): Movie? {
    if (mediaLoadRequestData == null) {
        return null
    }
    val mediaInfo: MediaInfo = mediaLoadRequestData.getMediaInfo() ?: return null
    var videoUrl: String = mediaInfo.getContentId()
    if (mediaInfo.getContentUrl() != null) {
        videoUrl = mediaInfo.getContentUrl()
    }
    val metadata: MediaMetadata = mediaInfo.getMetadata()
    val movie = Movie()
    movie.videoUrl = videoUrl
    movie.title = metadata?.getString(MediaMetadata.KEY_TITLE)
    movie.description = metadata?.getString(MediaMetadata.KEY_SUBTITLE)
    if(metadata?.hasImages() == true) {
        movie.cardImageUrl = metadata.images[0].url.toString()
    }
    return movie
}

Maintenant que le rappel a été défini, nous devons l'enregistrer dans le fragment MediaManager. Le rappel doit être enregistré avant l'appel de MediaManager.onNewIntent(). Ajoutez setMediaLoadCommandCallback lorsque le lecteur est initialisé :

private fun initializePlayer() {
    if (mPlayer == null) {
        ...
        mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
        ...
        castReceiverContext = CastReceiverContext.getInstance()
        if (castReceiverContext != null) {
            val mediaManager: MediaManager = castReceiverContext.getMediaManager()
            mediaManager.setSessionCompatToken(mMediaSession.getSessionToken())
            mediaManager.setMediaLoadCommandCallback(MyMediaLoadCommandCallback())
        }
    }
}

Exécuter l'exemple d'application

Cliquez sur le bouton Bouton &quot;Run&quot; (Exécuter) d&#39;Android Studio (triangle vert pointant vers la droite)Run (Exécuter) pour déployer l'application sur votre appareil Android TV. Depuis votre émetteur, cliquez sur l'icône Cast Icône du bouton Cast et sélectionnez votre appareil Android TV. L'application Android TV est alors lancée sur l'appareil Android TV. Sélectionnez une vidéo sur l'appareil mobile pour en démarrer la lecture sur l'appareil Android TV. Vérifiez si vous recevez une notification sur votre téléphone vous donnant accès à des commandes de lecture. Essayez d'utiliser les commandes telles que la mise en pause, qui devrait suspendre la lecture de la vidéo sur l'appareil Android TV.

7. Compatibilité avec les commandes Cast

L'application actuelle offre les commandes de base compatibles avec une session multimédia, telles que lecture, pause et la recherche. Toutefois, certaines commandes Google Cast ne sont pas disponibles dans une session multimédia. Vous devez enregistrer un rappel MediaCommandCallback pour pouvoir utiliser ces commandes Cast.

Ajoutez MyMediaCommandCallback à l'instance MediaManager en utilisant setMediaCommandCallback une fois le lecteur initialisé :

private fun initializePlayer() {
    ...
    castReceiverContext = CastReceiverContext.getInstance()
    if (castReceiverContext != null) {
        val mediaManager = castReceiverContext!!.mediaManager
        ...
        mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
    }
}

Créez la classe MyMediaCommandCallback pour remplacer certaines méthodes, par exemple onQueueUpdate(), afin d'activer ces commandes Cast :

private inner class MyMediaCommandCallback : MediaCommandCallback() {
    override fun onQueueUpdate(
        senderId: String?,
        queueUpdateRequestData: QueueUpdateRequestData
    ): Task<Void> {
        Toast.makeText(getActivity(), "onQueueUpdate()", Toast.LENGTH_SHORT).show()
        // Queue Prev / Next
        if (queueUpdateRequestData.getJump() != null) {
            Toast.makeText(
                getActivity(),
                "onQueueUpdate(): Jump = " + queueUpdateRequestData.getJump(),
                Toast.LENGTH_SHORT
            ).show()
        }
        return super.onQueueUpdate(senderId, queueUpdateRequestData)
    }
}

8. Utiliser les états de contenus multimédias

Modifier l'état d'un contenu multimédia

L'état de base du contenu multimédia est fourni à Cast Connect depuis la session multimédia. Pour utiliser les fonctionnalités avancées, votre application Android TV peut spécifier et remplacer des propriétés d'état supplémentaires via un élément MediaStatusModifier. MediaStatusModifier fonctionnera toujours sur la session MediaSession que vous avez définie dans CastReceiverContext.

Par exemple, voici comment spécifier setMediaCommandSupported lorsque le rappel onLoad est activé :

import com.google.android.gms.cast.MediaStatus
...
private class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
    fun onLoad(
        senderId: String?,
        mediaLoadRequestData: MediaLoadRequestData
    ): Task<MediaLoadRequestData> {
        Toast.makeText(getActivity(), "onLoad()", Toast.LENGTH_SHORT).show()
        ...
        return Tasks.call({
            play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
            ...
            // Use MediaStatusModifier to provide additional information for Cast senders.
            mediaManager.getMediaStatusModifier()
                .setMediaCommandSupported(MediaStatus.COMMAND_QUEUE_NEXT, true)
                .setIsPlayingAd(false)
            mediaManager.broadcastMediaStatus()
            // Return the resolved MediaLoadRequestData to indicate load success.
            mediaLoadRequestData
        })
    }
}

Intercepter l'état MediaStatus avant sa diffusion

Comme pour l'élément MessageInterceptor du SDK du récepteur Web, vous pouvez spécifier un MediaStatusWriter dans votre MediaManager si vous souhaitez apporter des modifications supplémentaires à votre MediaStatus avant qu'il ne soit diffusé auprès des émetteurs connectés.

Par exemple, vous pouvez définir des données personnalisées dans MediaStatus avant de les diffuser aux émetteurs mobiles :

import com.google.android.gms.cast.tv.media.MediaManager.MediaStatusInterceptor
import com.google.android.gms.cast.tv.media.MediaStatusWriter
import org.json.JSONObject
import org.json.JSONException
...

private fun initializePlayer() {
    if (mPlayer == null) {
        ...
        if (castReceiverContext != null) {
            ...
            val mediaManager: MediaManager = castReceiverContext.getMediaManager()
            ...
            // Use MediaStatusInterceptor to process the MediaStatus before sending out.
            mediaManager.setMediaStatusInterceptor(
                MediaStatusInterceptor { mediaStatusWriter: MediaStatusWriter ->
                    try {
                        mediaStatusWriter.setCustomData(JSONObject("{myData: 'CustomData'}"))
                    } catch (e: JSONException) {
                        Log.e(LOG_TAG,e.message,e);
                    }
            })
        }
    }
}        

9. Félicitations

Vous savez maintenant comment rendre une application Android TV compatible avec Google Cast à l'aide de la bibliothèque Cast Connect.

Pour en savoir plus, consultez le guide du développeur: /cast/docs/android_tv_receiver.