Inhalte mit einem MediaLibraryService bereitstellen

Medien-Apps enthalten oft in einer Hierarchie organisierte Sammlungen von Medienelementen. Zum Beispiel Titel in einem Album oder Serienfolgen in einer Playlist. Diese Hierarchie von Medienelementen wird als Mediathek bezeichnet.

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

Ein MediaLibraryService bietet eine standardisierte API für die Bereitstellung und den Zugriff auf Ihre Medienbibliothek. Das kann beispielsweise hilfreich sein, wenn Sie Ihrer Medien-App Android Auto hinzufügen, die eine eigene treibersichere UI für Ihre Mediathek bietet.

MediaLibraryService erstellen

Das Implementieren von MediaLibraryService ähnelt dem Implementieren einer MediaSessionService, nur dass du in der Methode onGetSession() anstelle von MediaSession ein MediaLibrarySession zurückgeben solltest.

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

Denke daran, deine Service und die erforderlichen Berechtigungen auch in der Manifestdatei zu deklarieren:

<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 abspielbar oder durchsuchbar sind.

Ein MediaLibrarySession erweitert die MediaSession API um Content Browsing APIs. Im Vergleich zum MediaSession-Callback werden beim MediaLibrarySession-Callback z. B. folgende Methoden hinzugefügt:

  • onGetLibraryRoot(), wenn ein Client den Stamm MediaItem eines Inhaltsbaums anfordert
  • onGetChildren(), wenn ein Client die untergeordneten Elemente von MediaItem im Inhaltsbaum anfordert
  • onGetSearchResult(), wenn ein Client Suchergebnisse aus dem Inhaltsbaum für eine bestimmte Abfrage anfordert

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