Медиа-приложения часто содержат коллекции медиа-элементов, организованных в иерархию. Например, песни в альбоме или телесериалы в плейлисте. Эта иерархия элементов мультимедиа известна как медиа-библиотека.
MediaLibraryService
предоставляет стандартизированный API для обслуживания и доступа к вашей медиатеке. Это может быть полезно, например, при добавлении поддержки Android Auto в ваше медиа-приложение, которое предоставляет собственный безопасный для драйверов пользовательский интерфейс для вашей медиатеки.
Создание MediaLibraryService
Реализация MediaLibraryService
аналогична реализации MediaSessionService
, за исключением того, что в методе onGetSession()
вы должны возвращать MediaLibrarySession
вместо MediaSession
.
Котлин
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() } }
Ява
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(); } }
Не забудьте также объявить свою Service
и необходимые разрешения в файле манифеста:
<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
API MediaLibraryService
ожидает, что ваша медиатека будет структурирована в виде дерева с одним корневым узлом и дочерними узлами, которые можно воспроизводить или просматривать в дальнейшем.
MediaLibrarySession
расширяет API MediaSession
, добавляя API просмотра контента. По сравнению с обратным вызовом MediaSession
, обратный вызов MediaLibrarySession
добавляет такие методы, как:
-
onGetLibraryRoot()
, когда клиент запрашивает корневойMediaItem
дерева контента. -
onGetChildren()
когда клиент запрашивает дочерние элементыMediaItem
в дереве контента -
onGetSearchResult()
когда клиент запрашивает результаты поиска из дерева контента для данного запроса
Соответствующие методы обратного вызова будут включать объект LibraryParams
с дополнительными сигналами о типе дерева контента, который интересует клиентское приложение.