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 di un programma TV in una playlist. Questa gerarchia di elementi multimediali è nota come raccolta multimediale.

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

Un MediaLibraryService fornisce un'API standardizzata per pubblicare e accedere alla tua biblioteca multimediale. Ciò può essere utile, ad esempio, quando aggiungi il supporto di Android Auto alla tua app multimediale, che fornisce la propria UI sicura per il conducente per la tua raccolta multimediale.

Creare un MediaLibraryService

L'implementazione di un MediaLibraryService è simile all'implementazione di un MediaSessionService, ma nel metodo onGetSession() devi restituire un MediaLibrarySession anziché 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();
  }
}

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

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

Utilizza un MediaLibrarySession

L'API MediaLibraryService prevede che la raccolta multimediale sia strutturata in un formato ad albero, con un singolo nodo principale e nodi secondari che possono essere riprodotti o esplorati ulteriormente.

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

  • onGetLibraryRoot() per quando un cliente richiede la radice MediaItem di un albero dei contenuti
  • onGetChildren() per quando un client richiede i figli di un MediaItem nella struttura ad albero dei contenuti
  • onGetSearchResult() per quando un client richiede risultati di ricerca dall'albero dei contenuti per una determinata query

I metodi di callback pertinenti includeranno un oggetto LibraryParams con indicatori aggiuntivi sul tipo di albero dei contenuti a cui è interessata un'app client.