Se connecter à une application multimédia

Un contrôleur multimédia interagit avec une session multimédia pour interroger et contrôler la lecture d'une application multimédia. Dans Media3, l'API MediaController implémente l'interface Player. Voici quelques exemples d'applications clientes qui utilisent un contrôleur multimédia:

Un contrôleur multimédia peut également être utile dans une application multimédia, par exemple si le lecteur et la session multimédia résident dans un Service distinct de l'Activity ou de l'Fragment avec l'UI.

Créer un élément MediaController

Pour créer un MediaController, commencez par créer un SessionToken pour le MediaSession correspondant. La méthode onStart() de votre Activity ou Fragment peut être un bon endroit pour cela.

Kotlin

val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.java))

Java

SessionToken sessionToken = 
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

L'utilisation de cet SessionToken pour créer ensuite un MediaController connecte le contrôleur à la session donnée. Cela se produit de manière asynchrone. Vous devez donc écouter le résultat et l'utiliser lorsqu'il est disponible.

Kotlin

val controllerFuture =
  MediaController.Builder(context, sessionToken).buildAsync()
controllerFuture.addListener({
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor())

Java

ListenableFuture<MediaController> controllerFuture =
  new MediaController.Builder(context, sessionToken).buildAsync();
controllerFuture.addListener(() -> {
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor());

Utiliser un MediaController

MediaController implémente l'interface Player. Vous pouvez donc utiliser les commandes définies dans l'interface pour contrôler la lecture de l'MediaSession connecté. Autrement dit, l'appel de play() sur un MediaController envoie la commande au MediaSession connecté, qui la délègue ensuite à son Player sous-jacent.

De même, vous pouvez ajouter un Player.Listener au contrôleur pour détecter les modifications de l'état Player. Pour en savoir plus sur l'utilisation d'un Player.Listener, consultez le guide sur les événements du lecteur. L'interface MediaController.Listener définit des rappels supplémentaires pour les événements et les commandes entrantes de l'MediaSession connecté, tels que onAvailableSessionCommandsChanged() pour les cas où la session multimédia modifie les commandes de session disponibles et onDisconnected() pour les cas où le contrôleur est déconnecté de la session.

Comme pour les autres composants, n'oubliez pas de libérer le MediaController lorsqu'il n'est plus nécessaire, par exemple dans la méthode onStop() d'un Activity ou d'un Fragment.

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

La libération du contrôleur transmettra toujours toutes les commandes en attente envoyées à la session et ne se dissociera du service de session qu'une fois ces commandes gérées ou après un délai avant expiration, selon la première éventualité.

Créer et utiliser un MediaBrowser

Un MediaBrowser s'appuie sur les fonctionnalités proposées par un MediaController pour permettre également de parcourir la bibliothèque multimédia proposée par le MediaLibraryService d'une application multimédia.

Kotlin

val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync()
browserFuture.addListener({
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor())

Java

ListenableFuture<MediaBrowser> browserFuture =
  new MediaBrowser.Builder(context, sessionToken).buildAsync();
browserFuture.addListener(() -> {
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor());

Pour commencer à parcourir la bibliothèque de contenu de l'application multimédia, récupérez d'abord le nœud racine avec getLibraryRoot():

Kotlin

// Get the library root to start browsing the library tree.
val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null)
rootFuture.addListener({
  // Root node MediaItem is available here with rootFuture.get().value
}, MoreExecutors.directExecutor())

Java

// Get the library root to start browsing the library tree.
ListenableFuture<LibraryResult<MediaItem>> rootFuture =
  mediaBrowser.getLibraryRoot(/* params= */ null);
rootFuture.addListener(() -> {
  // Root node MediaItem is available here with rootFuture.get().value
}, MoreExecutors.directExecutor());

Vous pouvez ensuite parcourir la bibliothèque multimédia en récupérant les enfants d'un MediaItem dans la bibliothèque avec getChildren(). Par exemple, pour récupérer les enfants du nœud racine MediaItem:

Kotlin

// Get the library root to start browsing the library tree.
val childrenFuture = 
  mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null)
childrenFuture.addListener({
  // List of children MediaItem nodes is available here with
  // childrenFuture.get().value
}, MoreExecutors.directExecutor())

Java

ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture =
  mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null);
childrenFuture.addListener(() -> {
  // List of children MediaItem nodes is available here with
  // childrenFuture.get().value
}, MoreExecutors.directExecutor());