MediaLibraryService로 콘텐츠 제공

미디어 앱에는 계층 구조로 구성된 미디어 항목 컬렉션이 포함되는 경우가 많습니다. 예를 들어 앨범의 노래 또는 재생목록의 TV 에피소드가 여기에 해당합니다. 이러한 미디어 항목 계층 구조를 미디어 라이브러리라고 합니다.

계층 구조로 정렬된 미디어 콘텐츠의 예
그림 1: 미디어 라이브러리를 형성하는 미디어 항목 계층 구조 예

MediaLibraryService는 미디어 라이브러리를 제공하고 액세스하기 위한 표준화된 API를 제공합니다. 예를 들어 미디어 라이브러리에 자체 드라이버 안전 UI를 제공하는 Android Auto 지원을 미디어 앱에 추가할 때 유용할 수 있습니다.

MediaLibraryService 빌드

MediaLibraryService 구현은 MediaSessionService 구현과 비슷하지만 onGetSession() 메서드에서 MediaSession 대신 MediaLibrarySession를 반환해야 한다는 점이 다릅니다.

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();
  }
}

매니페스트 파일에서 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 사용

MediaLibraryService API는 미디어 라이브러리가 단일 루트 노드 및 재생 가능 또는 추가로 탐색 가능할 수 있는 하위 노드로 이루어진 트리 형식으로 구조화되어야 합니다.

MediaLibrarySessionMediaSession API를 확장하여 콘텐츠 탐색 API를 추가합니다. MediaSession 콜백과 비교하여 MediaLibrarySession 콜백은 다음과 같은 메서드를 추가합니다.

  • onGetLibraryRoot(): 클라이언트가 콘텐츠 트리의 루트 MediaItem를 요청하는 경우
  • onGetChildren(): 클라이언트가 콘텐츠 트리에서 MediaItem의 하위 요소를 요청하는 경우
  • onGetSearchResult(): 클라이언트가 특정 쿼리의 콘텐츠 트리에서 검색결과를 요청하는 경우

관련 콜백 메서드에는 클라이언트 앱에서 관심이 있는 콘텐츠 트리 유형에 관한 추가 신호가 있는 LibraryParams 객체가 포함됩니다.