Diffuser du contenu avec MediaLibraryService

Les applications multimédias contiennent souvent des collections d'éléments multimédias organisés de façon hiérarchique. Il peut s'agir, par exemple, des chansons d'un album ou des épisodes de séries TV d'une playlist. Cette hiérarchie de éléments multimédias est connue sous le nom de bibliothèque multimédia.

<ph type="x-smartling-placeholder">
</ph> Exemples de contenus multimédias organisés selon une hiérarchie
Figure 1: Exemples de hiérarchies d'éléments multimédias formant un bibliothèque multimédia.

Un MediaLibraryService fournit une API standardisée pour diffuser et accéder à vos bibliothèque multimédia. Cela peut être utile, par exemple, pour prendre en charge Android Auto à votre application multimédia, qui fournit sa propre pour votre bibliothèque multimédia.

Créer un MediaLibraryService

L'implémentation d'un MediaLibraryService est semblable à implémenter un MediaSessionService ; sauf que dans la méthode onGetSession(), vous devez renvoie un MediaLibrarySession au lieu d'un MediaSession.

Kotlin

class PlaybackService : MediaLibraryService() {
  var mediaLibrarySession: MediaLibrarySession? = null
  var callback: MediaLibrarySession.Callback = object : MediaLibrarySession.Callback {...}

  // If desired, validate the controller before returning the media library session
  override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaLibrarySession? =
    mediaLibrarySession

  // Create your player and media library session in the onCreate lifecycle event
  override fun onCreate() {
    super.onCreate()
    val player = ExoPlayer.Builder(this).build()
    mediaLibrarySession = MediaLibrarySession.Builder(this, player, callback).build()
  }

  // Remember to release the player and media library session in onDestroy
  override fun onDestroy() {
    mediaLibrarySession?.run { 
      player.release()
      release()
      mediaLibrarySession = null
    }
    super.onDestroy()
  }
}

Java

class PlaybackService extends MediaLibraryService {
  MediaLibrarySession mediaLibrarySession = null;
  MediaLibrarySession.Callback callback = new MediaLibrarySession.Callback() {...};

  @Override
  public MediaLibrarySession onGetSession(MediaSession.ControllerInfo controllerInfo) {
    // If desired, validate the controller before returning the media library session
    return mediaLibrarySession;
  }

  // Create your player and media library session in the onCreate lifecycle event
  @Override
  public void onCreate() {
    super.onCreate();
    ExoPlayer player = new ExoPlayer.Builder(this).build();
    mediaLibrarySession = new MediaLibrarySession.Builder(this, player, callback).build();
  }

  // Remember to release the player and media library session in onDestroy
  @Override
  public void onDestroy() {
    if (mediaLibrarySession != null) {
      mediaLibrarySession.getPlayer().release();
      mediaLibrarySession.release();
      mediaLibrarySession = null;
    }
    super.onDestroy();
  }
}

N'oubliez pas de déclarer votre Service et les autorisations requises dans le fichier manifeste ainsi que:

<service
    android:name=".PlaybackService"
    android:foregroundServiceType="mediaPlayback"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.media3.session.MediaSessionService"/>
    </intent-filter>
</service>

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- For targetSdk 34+ -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />

Utiliser un MediaLibrarySession

L'API MediaLibraryService s'attend à ce que votre bibliothèque multimédia soit structurée selon un avec un seul nœud racine et des nœuds enfants jouable ou explorables plus en détail.

Un MediaLibrarySession étend l'API MediaSession pour ajouter des API de navigation de contenu. Par rapport aux Rappel MediaSession, le rappel MediaLibrarySession ajoute des méthodes telles que:

  • onGetLibraryRoot() lorsqu'un client demande la racine MediaItem d'une arborescence de contenu
  • onGetChildren() lorsqu'un client demande les enfants d'un élément MediaItem dans l'arborescence de contenu
  • onGetSearchResult() lorsqu'un client demande des résultats de recherche dans l'arborescence de contenu pour une requête

Les méthodes de rappel pertinentes incluront un LibraryParams objet avec des signaux supplémentaires sur le type d'arborescence de contenu qu'une application cliente qui vous intéresse.