Pubblicazione dei contenuti con MediaLibraryService

Le app multimediali spesso contengono raccolte di elementi multimediali, organizzati in una gerarchia. Ad esempio, i brani di un album o le puntate TV di una playlist. Questa gerarchia di elementi multimediali è nota come media Library.

Esempi di contenuti multimediali disposti in una gerarchia
Figura 1: esempi di gerarchie di elementi multimediali che formano una raccolta multimediale.

Un MediaLibraryService fornisce un'API standardizzata per la pubblicazione e l'accesso ai tuoi raccolta multimediale. Ciò può essere utile, ad esempio, quando si aggiunge il supporto di Android Auto all'app multimediale, che fornisce una sua per la tua raccolta multimediale.

Crea un MediaLibraryService

L'implementazione di un MediaLibraryService è simile all'implementazione l'implementazione di un MediaSessionService, tranne che nel metodo onGetSession(), devi restituisce MediaLibrarySession invece di 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();
  }
}

Ricordati di dichiarare Service e le autorizzazioni richieste nel file manifest anche:

<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" />

Usa un MediaLibrarySession

L'API MediaLibraryService prevede che la raccolta multimediale sia strutturata in un ad albero, con un singolo nodo radice e nodi figlio che possono essere riproducibile o ulteriormente sfogliabile.

Un MediaLibrarySession estende l'API MediaSession per aggiungere API di navigazione dei contenuti. Rispetto alla chiamata di MediaSession, il callback MediaLibrarySession aggiunge metodi come:

  • onGetLibraryRoot() quando un client richiede la radice MediaItem di una struttura ad albero di contenuti
  • onGetChildren() quando un client richiede gli elementi secondari di un MediaItem nell'albero dei contenuti
  • onGetSearchResult() quando un client richiede i risultati di ricerca dalla struttura ad albero dei contenuti per un query

I metodi di callback pertinenti includeranno un elemento LibraryParams con indicatori aggiuntivi sul tipo di struttura ad albero dei contenuti che un'app client a cui interessa.