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 von wird als Medienbibliothek bezeichnet.

<ph type="x-smartling-placeholder">
</ph> Beispiele für hierarchisch angeordnete Medieninhalte
Abbildung 1: Beispiele für Hierarchien von Medienelementen, die ein Mediathek.

Ein MediaLibraryService stellt eine standardisierte API für die Bereitstellung und den Zugriff auf Ihre in der Mediathek. Das kann hilfreich sein, wenn Sie beispielsweise Android Auto auf deine Medien-App, die eine eigene treibersichere UI für deine Mediathek.

MediaLibraryService erstellen

Die Implementierung eines MediaLibraryService ähnelt der ein MediaSessionService implementieren, mit der Ausnahme, dass Sie in der Methode onGetSession() MediaLibrarySession statt MediaSession zurückgeben.

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 deine Service und die erforderlichen Berechtigungen in der Manifestdatei Außerdem:

<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 Mediathek in folgender Form strukturiert ist: Baumformat mit einem einzigen Stammknoten und untergeordneten Knoten, die möglicherweise abspielbar oder weiter durchsuchbar.

MediaLibrarySession erweitert die MediaSession API um APIs zum Durchsuchen von Inhalten. Im Vergleich zu den MediaSession-Callback, MediaLibrarySession-Callback fügt Methoden hinzu wie:

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

Relevante Callback-Methoden sind LibraryParams. Objekt mit zusätzlichen Signalen zum Typ der Inhaltsstruktur, die eine Client-App interessiert.