미디어 앱에 연결

미디어 컨트롤러는 미디어 세션과 상호작용하여 미디어 앱의 재생을 쿼리하고 제어합니다. Media3에서 MediaController API는 Player 인터페이스를 구현합니다. 미디어 컨트롤러를 사용하는 클라이언트 앱의 예는 다음과 같습니다.

미디어 컨트롤러는 미디어 앱 내에서도 유용할 수 있습니다. 예를 들어 플레이어와 미디어 세션이 UI를 통해 Activity 또는 Fragment와 별개로 Service에 상주하는 경우

MediaController를 만드는 방법

MediaController를 만들려면 먼저 상응하는 MediaSessionSessionToken를 만듭니다. 이때는 Activity 또는 FragmentonStart() 메서드가 적합합니다.

Kotlin

val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.java))

Java

SessionToken sessionToken = 
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

그런 다음 이 SessionToken를 사용하여 MediaController를 빌드하면 컨트롤러를 지정된 세션에 연결합니다. 이 작업은 비동기식으로 진행되므로 결과를 수신 대기하고 가능한 경우 사용해야 합니다.

Kotlin

val controllerFuture =
  MediaController.Builder(context, sessionToken).buildAsync()
controllerFuture.addListener({
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor())

Java

ListenableFuture<MediaController> controllerFuture =
  new MediaController.Builder(context, sessionToken).buildAsync();
controllerFuture.addListener(() -> {
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor());

MediaController 사용

MediaControllerPlayer 인터페이스를 구현하므로 인터페이스에 정의된 명령어를 사용하여 연결된 MediaSession의 재생을 제어할 수 있습니다. 즉, MediaController에서 play()를 호출하면 연결된 MediaSession로 명령어가 전송되고, 그러면 이후에 명령어가 기본 Player에 위임됩니다.

마찬가지로 컨트롤러에 Player.Listener를 추가하여 Player 상태의 변경사항을 수신 대기할 수 있습니다. Player.Listener 사용에 관한 자세한 내용은 플레이어 이벤트 가이드를 참고하세요. MediaController.Listener 인터페이스는 미디어 세션이 사용 가능한 세션 명령어를 변경하는 경우를 위한 onAvailableSessionCommandsChanged() 및 컨트롤러가 세션에서 연결 해제된 경우를 위한 onAvailableSessionCommandsChanged()와 같이 이벤트 및 연결된 MediaSession의 수신 명령어에 관한 추가 콜백을 정의합니다.onDisconnected()

다른 구성요소와 마찬가지로 Activity 또는 FragmentonStop() 메서드와 같이 더 이상 필요하지 않은 경우 MediaController를 해제해야 합니다.

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

컨트롤러를 해제하면 여전히 세션에 전송된 대기 중인 모든 명령어가 전달되며 이러한 명령어가 처리된 후나 제한 시간이 지난 후(둘 중 먼저 발생하는 것 적용) 세션 서비스에서 바인딩 해제됩니다.

MediaBrowser 만들기 및 사용

MediaBrowserMediaController에서 제공하는 기능을 기반으로 빌드되어 미디어 앱의 MediaLibraryService에서 제공하는 미디어 라이브러리도 탐색할 수 있도록 합니다.

Kotlin

val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync()
browserFuture.addListener({
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor())

Java

ListenableFuture<MediaBrowser> browserFuture =
  new MediaBrowser.Builder(context, sessionToken).buildAsync();
browserFuture.addListener(() -> {
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor());

미디어 앱의 콘텐츠 라이브러리 탐색을 시작하려면 먼저 getLibraryRoot()를 사용하여 루트 노드를 검색합니다.

Kotlin

// Get the library root to start browsing the library tree.
val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null)
rootFuture.addListener({
  // Root node MediaItem is available here with rootFuture.get().value
}, MoreExecutors.directExecutor())

Java

// Get the library root to start browsing the library tree.
ListenableFuture<LibraryResult<MediaItem>> rootFuture =
  mediaBrowser.getLibraryRoot(/* params= */ null);
rootFuture.addListener(() -> {
  // Root node MediaItem is available here with rootFuture.get().value
}, MoreExecutors.directExecutor());

그런 다음 getChildren()로 라이브러리에서 MediaItem의 하위 요소를 검색하여 미디어 라이브러리를 탐색할 수 있습니다. 예를 들어 루트 노드 MediaItem의 하위 요소를 검색하려면 다음을 실행합니다.

Kotlin

// Get the library root to start browsing the library tree.
val childrenFuture = 
  mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null)
childrenFuture.addListener({
  // List of children MediaItem nodes is available here with
  // childrenFuture.get().value
}, MoreExecutors.directExecutor())

Java

ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture =
  mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null);
childrenFuture.addListener(() -> {
  // List of children MediaItem nodes is available here with
  // childrenFuture.get().value
}, MoreExecutors.directExecutor());