미디어 컨트롤러는 미디어 세션과 상호작용하여 미디어를 쿼리하고 제어합니다.
있습니다. Media3에서 MediaController
는
API는 Player
인터페이스를 구현합니다. 미디어를 사용하는 클라이언트 앱의 예
컨트롤러에는 다음이 포함됩니다.
- Android 시스템 미디어 컨트롤
- Android Wear OS 호환 앱
- Android Auto 및 Automotive OS
- 음성 어시스턴트(예: Google 어시스턴트)
- 미디어 컨트롤러 테스트 앱
미디어 컨트롤러는 미디어 앱 내에서도 유용할 수 있습니다(예:
플레이어 및 미디어 세션이 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
사용
MediaController
는 Player
인터페이스를 구현하므로 다음 명령어를 사용할 수 있습니다.
연결된 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
생성 및 사용
MediaBrowser
은
MediaController
: 미디어에서 제공하는 미디어 라이브러리 탐색도 사용 설정합니다.
앱의 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());