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 :
- Commandes multimédias du système Android
- Application associée Android Wear OS
- Android Auto et Automotive OS
- Assistants vocaux, comme l'Assistant Google
- L'application de test du 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 se trouvent dans un Service
distinct du Activity
ou du 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 SessionToken
pour créer un MediaController
permet de connecter le contrôleur à la session donnée. Cette opération se déroule 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());
Utilisez un MediaController
MediaController
implémente l'interface Player
. Vous pouvez donc utiliser les commandes définies dans l'interface pour contrôler la lecture du MediaSession
connecté.
En d'autres termes, appeler play()
sur un MediaController
enverra la commande au MediaSession
connecté, qui la déléguera ensuite à son Player
sous-jacent.
Vous pouvez ajouter un Player.Listener
au contrôleur pour écouter les modifications de l'état Player
. Pour en savoir plus sur l'utilisation d'un Player.Listener
, consultez le guide Événements du lecteur.
L'interface MediaController.Listener
définit des rappels supplémentaires pour les événements et les commandes personnalisées du MediaSession
connecté. Par exemple, onCustomCommand()
lorsque la session envoie une commande personnalisée, onAvailableSessionCommandsChanged()
lorsque la session modifie les commandes de session disponibles ou onDisconnected()
lorsque le contrôleur est déconnecté de la session.
Un MediaController.Listener
peut être défini lors de la création du contrôleur avec un Builder
:
Kotlin
MediaController.Builder(context, sessionToken)
.setListener(
object : MediaController.Listener {
override fun onCustomCommand(
controller: MediaController,
command: SessionCommand,
args: Bundle,
): ListenableFuture<SessionResult> {
// Handle custom command.
return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
}
override fun onDisconnected(controller: MediaController) {
// Handle disconnection.
}
}
)
.buildAsync()
Java
new MediaController.Builder(context, sessionToken)
.setListener(
new MediaController.Listener() {
@Override
public ListenableFuture<SessionResult> onCustomCommand(
MediaController controller, SessionCommand command, Bundle args) {
// Handle custom command.
return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
}
@Override
public void onDisconnected(MediaController controller) {
// Handle disconnection.
}
})
.buildAsync();
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 Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Le fait de relâcher le contrôleur permet toujours de transmettre toutes les commandes en attente envoyées à la session et de se dissocier du service de session une fois ces commandes traitées ou après un délai d'inactivité, selon la première éventualité.
Créer et utiliser un MediaBrowser
Un MediaBrowser
s'appuie sur les fonctionnalités offertes par un MediaController
pour permettre également la navigation dans 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());
Afficher les commandes de lecture pour une autre application multimédia
Lorsque vous affichez des commandes d'interface utilisateur avec des boutons pour une autre application multimédia, il est important de suivre les préférences déclarées pour les boutons multimédias de cette application.
Le meilleur moyen de résoudre les préférences de l'application, ainsi que les contraintes et les exigences de votre UI, est d'utiliser CommandButton.DisplayConstraints
. Vous pouvez définir les limites et les restrictions de votre UI, et la méthode resolve
fournit une liste précise des boutons à afficher avec leur icône, leur position et l'action prévue.