Inhalte mit einem MediaLibraryService bereitstellen

Medien-Apps enthalten häufig Sammlungen von Medienelementen, die in einer Hierarchie organisiert sind. Das können beispielsweise Titel in einem Album oder Serienfolgen in einer Playlist sein. Diese Hierarchie der Medienelemente wird als Medienbibliothek bezeichnet.

Beispiele für Medieninhalte, die in einer Hierarchie angeordnet sind
Abbildung 1: Beispiele für Hierarchien von Medienelementen, die eine Mediathek bilden.

Ein MediaLibraryService bietet eine standardisierte API zum Bereitstellen und Zugriff auf deine Medienbibliothek. Das kann beispielsweise hilfreich sein, wenn Sie Ihrer Medien-App die Unterstützung für Android Auto hinzufügen, die eine eigene fahrerfreundliche Benutzeroberfläche für Ihre Medienbibliothek bietet.

MediaLibraryService erstellen

Die Implementierung einer MediaLibraryService ähnelt der Implementierung einer MediaSessionService, mit der Ausnahme, dass in der onGetSession()-Methode eine MediaLibrarySession anstelle einer MediaSession zurückgegeben werden sollte.

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

Deklarieren Sie auch Ihre Service und die erforderlichen Berechtigungen in der Manifestdatei:

<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 deine Medienbibliothek in einem Baumformat mit einem einzelnen Stammknoten und untergeordneten Knoten strukturiert ist, die abgespielt oder weiter durchsucht werden können.

Ein MediaLibrarySession erweitert die MediaSession API um APIs zum Durchsuchen von Inhalten. Im Vergleich zum MediaSession-Callback bietet der MediaLibrarySession-Callback Methoden wie:

  • onGetLibraryRoot() für den Fall, dass ein Client den MediaItem-Stamm einer Inhaltsstruktur anfordert
  • onGetChildren() wird verwendet, wenn ein Client die untergeordneten Elemente eines MediaItem im Inhaltsbaum anfordert
  • onGetSearchResult() wird verwendet, wenn ein Client Suchergebnisse aus dem Inhaltsbaum für eine bestimmte Suchanfrage anfordert

Zu den relevanten Callback-Methoden gehört ein LibraryParams-Objekt mit zusätzlichen Signalen zur Art der Inhaltsstruktur, an der eine Client-App interessiert ist.