Обслуживание контента с помощью MediaLibraryService

Медиа-приложения часто содержат коллекции медиа-элементов, организованных в иерархию. Например, песни в альбоме или телесериалы в плейлисте. Эта иерархия элементов мультимедиа известна как медиа-библиотека.

Примеры медиаконтента, расположенные в иерархии
Рисунок 1. Примеры иерархий медиа-элементов, образующих медиа-библиотеку.

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 с дополнительными сигналами о типе дерева контента, который интересует клиентское приложение.