미디어 앱에 연결

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

미디어 컨트롤러는 미디어 앱 내에서도 유용할 수 있습니다(예: 플레이어 및 미디어 세션이 Activity와는 별개로 Service에 상주하거나 Fragment를 UI에 표시합니다.

MediaController를 만드는 방법

MediaController를 만들려면 먼저 SessionToken를 만듭니다. 상응하는 MediaSession입니다. onStart() 메서드 Activity 또는 Fragment가 좋은 곳이 될 수 있습니다.

Kotlin

val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.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())

자바

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 인터페이스는 이벤트에 대한 추가 콜백과 연결된 MediaSession(예: onAvailableSessionCommandsChanged() 미디어 세션이 사용 가능한 세션 명령어를 변경하는 시점과 onDisconnected() 컨트롤러가 세션에서 연결 해제되었을 때를 나타냅니다.

다른 구성요소와 마찬가지로 다음과 같은 경우 MediaController를 해제해야 합니다. Activity 또는onStop() Fragment입니다.

Kotlin

MediaController.releaseFuture(controllerFuture)

자바

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

자바

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

자바

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