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.
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 StammMediaItem
eines Inhaltsbaums anfordertonGetChildren()
, wenn ein Client die untergeordneten Elemente vonMediaItem
im Inhaltsbaum anfordertonGetSearchResult()
, 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.