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.
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 denMediaItem
-Stamm einer Inhaltsstruktur anfordertonGetChildren()
für den Fall, dass ein Client die untergeordneten Elemente vonMediaItem
in der Inhaltsstruktur anfordertonGetSearchResult()
, 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.