Inhalte mit einem MediaLibraryService bereitstellen

Medien-Apps enthalten oft Sammlungen von Medieninhalten, die hierarchisch organisiert sind. Zum Beispiel Titel in einem Album oder Folgen von Serien in einer Playlist. Diese Hierarchie der Medienelemente wird als Medienbibliothek bezeichnet.

Beispiele für hierarchisch angeordnete Medieninhalte
Abbildung 1: Beispiele für Hierarchien von Medienelementen, die eine Mediathek bilden.

Ein MediaLibraryService stellt eine standardisierte API für die Bereitstellung und den Zugriff auf Ihre Mediathek bereit. Das ist vor allem dann hilfreich, wenn du deiner Medien-App Android Auto hinzufügen möchtest, da diese eine eigene treibersichere UI für deine Mediathek bietet.

MediaLibraryService erstellen

Die Implementierung einer MediaLibraryService ähnelt der Implementierung einer MediaSessionService, mit der Ausnahme, dass Sie in der Methode onGetSession() einen MediaLibrarySession anstelle eines MediaSession-Werts zurückgeben sollten.

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();
  }
}

Deklariere in der Manifestdatei dein Service und die erforderlichen Berechtigungen:

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

MediaLibrarySession verwenden

Die MediaLibraryService API erwartet, dass Ihre Mediathek in einem Baumformat mit einem einzelnen Stammknoten und untergeordneten Knoten strukturiert ist, die möglicherweise abspielbar oder aufrufbar sind.

Ein MediaLibrarySession erweitert die MediaSession API um APIs zum Durchsuchen von Inhalten. Im Vergleich zum MediaSession-Callback fügt der MediaLibrarySession-Callback folgende Methoden hinzu:

  • onGetLibraryRoot() für den Fall, dass ein Client den MediaItem-Stamm einer Inhaltsstruktur anfordert
  • onGetChildren() für den Fall, dass ein Client die untergeordneten Elemente von MediaItem in der Inhaltsstruktur anfordert
  • onGetSearchResult(), wenn ein Client Suchergebnisse aus der Inhaltsstruktur für eine bestimmte Abfrage anfordert

Relevante Callback-Methoden enthalten ein LibraryParams-Objekt mit zusätzlichen Signalen zur Art der Inhaltsstruktur, an der eine Client-App interessiert ist.