Jetpack Media3은 기본 기능을 설명하는 Player
인터페이스를 정의합니다.
동영상 및 오디오 파일 재생에 사용됩니다. ExoPlayer
가 기본 구현입니다.
인터페이스입니다. ExoPlayer를 사용하는 것이 좋습니다. 왜냐하면 ExoPlayer는
포괄적인 기능을 갖추었고 이는 대부분의 재생 사용 사례를 포괄하며
필요에 따라 맞춤설정이 가능합니다. ExoPlayer도
기기와 OS 단편화를 추상화하여 코드가 일관되게 작동합니다.
애플리케이션을 개발하고 있습니다 ExoPlayer에 포함되는 항목:
이 페이지에서는 재생 환경을 구축하는 주요 단계를 안내합니다. 자세히 알아보려면 Media3 ExoPlayer:
시작하기
시작하려면 Jetpack Media3:
implementation "androidx.media3:media3-exoplayer:1.4.1" implementation "androidx.media3:media3-ui:1.4.1" implementation "androidx.media3:media3-common:1.4.1"
사용 사례에 따라 Media3의 추가 모듈이 필요할 수도 있습니다.
예를 들어 exoplayer-dash
는 DASH 형식의 스트림을 재생합니다.
1.4.1
를 원하는 버전의
있습니다. 출시 노트를 참고하세요.
최신 버전을 확인하세요.
미디어 플레이어 만들기
Media3을 사용하면 포함된 Player
구현을 사용하거나
ExoPlayer
인터페이스를 직접 구현하거나 자체 맞춤 구현을 빌드할 수 있습니다.
ExoPlayer 만들기
ExoPlayer
인스턴스를 만드는 가장 간단한 방법은 다음과 같습니다.
Kotlin
val player = ExoPlayer.Builder(context).build()
자바
ExoPlayer player = new ExoPlayer.Builder(context).build();
다음 인스턴스의 onCreate()
수명 주기 메서드에서 미디어 플레이어를 만들 수 있습니다.
Activity
, Fragment
또는 Service
입니다.
Builder
에는 다음이 포함됩니다.
다음과 같이 다양한 맞춤설정 옵션을 확인해 보세요.
setAudioAttributes()
드림 오디오 포커스 처리 구성setHandleAudioBecomingNoisy()
드림 - 오디오 출력 장치가 연결 해제될 때 재생 동작을 구성합니다.setTrackSelector()
드림 트랙 선택 설정
Media3은 앱의 PlayerView
UI 구성요소를
레이아웃 파일을 만듭니다. 이 구성요소는 재생을 위한 PlayerControlView
를 캡슐화합니다.
컨트롤, SubtitleView
(자막 표시), Surface
(렌더링)
있습니다.
플레이어 준비
다음 동영상의 재생목록에 미디어 항목 추가
다음과 같은 메서드로 재생
setMediaItem()
및 addMediaItem()
입니다.
그런 다음 prepare()
를 호출하여 다음을 수행합니다.
필요한 리소스를 확보할 수 있습니다.
앱이 포그라운드로 전환되기 전에 이 단계를 실행해서는 안 됩니다. 만약
플레이어가 Activity
또는 Fragment
에 있는 경우, 이는 플레이어를
API 수준 24 이상 또는 onResume()
의 onStart()
수명 주기 메서드
수명 주기 메서드를 지원합니다. Service
에 있는 플레이어의 경우
onCreate()
에서 준비할 수 있습니다.
플레이어 제어
플레이어가 준비되면 메서드를 호출하여 재생을 제어할 수 있습니다. 예:
play()
및pause()
재생을 시작하고 일시중지합니다.seekTo()
을(를) 통해 현재 미디어 항목 내 위치seekToNextMediaItem()
드림 및seekToPreviousMediaItem()
재생목록 탐색
PlayerView
또는 PlayerControlView
와 같은 UI 구성요소가 업데이트됩니다.
알 수 있습니다.
플레이어 해제
재생 시 동영상과 같이 공급이 제한적인 리소스가 필요할 수 있습니다.
디코더이므로 release()
를 호출하여
플레이어가 더 이상 필요하지 않을 때 리소스를 확보할 수 있습니다.
플레이어가 Activity
또는 Fragment
에 있는 경우
API 수준 24 이상 또는 onPause()
의 onStop()
수명 주기 메서드
API 수준 23 이하에서 지원됩니다. Service
에 있는 플레이어의 경우 다음 작업을 할 수 있습니다.
onDestroy()
에서 해제합니다.
미디어 세션으로 재생 관리
Android에서 미디어 세션은 미디어와 상호작용하는 표준화된 방법을 제공합니다. 할 수 있습니다. 플레이어에 미디어 세션 연결 을(를) 사용하면 미디어 재생을 외부에 광고하고 재생을 수신할 수 있습니다. 예를 들어, 외부 소스로부터의 명령어(예: 모바일 및 대형의 시스템 미디어 컨트롤 화면 기기
미디어 세션을 사용하려면 Media3 세션 모듈에 대한 종속 항목을 추가합니다.
implementation "androidx.media3:media3-session:1.4.1"
미디어 세션 만들기
플레이어를 초기화한 후 다음과 같이 MediaSession
를 만들 수 있습니다.
Kotlin
val player = ExoPlayer.Builder(context).build() val mediaSession = MediaSession.Builder(context, player).build()
자바
ExoPlayer player = new ExoPlayer.Builder(context).build(); MediaSession mediaSession = new MediaSession.Builder(context, player).build();
Media3은 Player
의 상태를 자동으로
MediaSession
이 기능은 다음을 포함한 모든 Player
구현에서 작동합니다.
ExoPlayer
, CastPlayer
또는 a
구현할 수 있습니다.
다른 클라이언트에 제어 권한 부여
클라이언트 앱이 미디어 컨트롤러를 구현할 수 있음
미디어 세션의 재생을 제어합니다. 이러한 요청을 수신하려면
callback 객체
MediaSession
빌드 중
컨트롤러가 미디어 세션에 연결하려고 하면
onConnect()
드림
메서드가 호출됩니다. 제공된 ControllerInfo
동의 여부를
또는 거부
요청을 처리합니다 Media3 세션 데모 앱에서 예를 참고하세요.
연결되면 컨트롤러가 세션으로 재생 명령어를 전송할 수 있습니다. 이
세션에서 이러한 명령을 플레이어에게 위임합니다. 재생 및 재생목록
Player
인터페이스에 정의된 명령어는
세션입니다.
다른 콜백 메서드를 사용하면 예를 들어
맞춤 재생 명령
재생목록 수정 등이 포함됩니다. 이러한 콜백은 마찬가지로 ControllerInfo
객체를 포함하므로
요청별로 액세스 제어를 결정할 수 있습니다.
백그라운드에서 미디어 재생 중
앱이 포그라운드에 있지 않을 때 미디어를 계속 재생하려는 경우(예:
앱이 없어도 음악, 오디오북, 팟캐스트 재생
열려 있으면 Player
및 MediaSession
가
포그라운드 서비스에 Cloud Storage를
사용하는 것이 좋습니다 Media3은
MediaSessionService
인터페이스를 사용해야 합니다.
MediaSessionService
구현
MediaSessionService
를 확장하고
onCreate()
수명 주기 메서드의 MediaSession
Kotlin
class PlaybackService : MediaSessionService() { private var mediaSession: MediaSession? = null // Create your Player and MediaSession in the onCreate lifecycle event override fun onCreate() { super.onCreate() val player = ExoPlayer.Builder(this).build() mediaSession = MediaSession.Builder(this, player).build() } // Remember to release the player and media session in onDestroy override fun onDestroy() { mediaSession?.run { player.release() release() mediaSession = null } super.onDestroy() } }
자바
public class PlaybackService extends MediaSessionService { private MediaSession mediaSession = null; @Override public void onCreate() { super.onCreate(); ExoPlayer player = new ExoPlayer.Builder(this).build(); mediaSession = new MediaSession.Builder(this, player).build(); } @Override public void onDestroy() { mediaSession.getPlayer().release(); mediaSession.release(); mediaSession = null; super.onDestroy(); } }
매니페스트에서 MediaSessionService
인텐트가 있는 Service
클래스
필터링 및 포그라운드 실행을 위한 FOREGROUND_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" />
마지막으로 만든 클래스에서 onGetSession()
메서드를 재정의하여
클라이언트 액세스가 필요합니다. MediaSession
를 반환하여
연결 요청을 거부하거나 null
를 반환하여 요청을 거부합니다.
Kotlin
// This example always accepts the connection request override fun onGetSession( controllerInfo: MediaSession.ControllerInfo ): MediaSession? = mediaSession
자바
@Override public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) { // This example always accepts the connection request return mediaSession; }
UI에 연결
이제 미디어 세션이 Activity
와는 다른 Service
에 있습니다. 또는
플레이어 UI가 있는 Fragment
의 경우 MediaController
를 사용하여
통합하지 않아도 됩니다 Activity
또는 Fragment
의 onStart()
메서드에서 다음을 실행합니다.
MediaSession
용 SessionToken
를 만들고 SessionToken
를 사용합니다.
를 사용하여 MediaController
를 빌드합니다. MediaController
빌드
있습니다.
Kotlin
override fun onStart() { val sessionToken = SessionToken(this, ComponentName(this, PlaybackService::class.java)) val controllerFuture = MediaController.Builder(this, sessionToken).buildAsync() controllerFuture.addListener( { // Call controllerFuture.get() to retrieve the MediaController. // MediaController implements the Player interface, so it can be // attached to the PlayerView UI component. playerView.setPlayer(controllerFuture.get()) }, MoreExecutors.directExecutor() ) }
자바
@Override public void onStart() { SessionToken sessionToken = new SessionToken(this, new ComponentName(this, PlaybackService.class)); ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(this, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // Call controllerFuture.get() to retrieve the MediaController. // MediaController implements the Player interface, so it can be // attached to the PlayerView UI component. playerView.setPlayer(controllerFuture.get()); }, MoreExecutors.directExecutor()) }
MediaController
는 Player
인터페이스를 구현하므로 동일한 메서드를 사용할 수 있습니다.
재생을 제어하는 play()
및 pause()
와 같은 메서드. 기타 유사 채널
구성요소가 더 이상 필요하지 않으면 MediaController
를 해제해야 합니다.
필요한 경우(예: Activity
의 onStop()
수명 주기 메서드)
MediaController.releaseFuture()
알림 게시
활성 상태에서 알림을 게시하려면 포그라운드 서비스가 필요합니다. 가
MediaSessionService
이(가) 자동으로
다음에 대한 알림 MediaStyle
개
MediaNotification
의 형식으로 제공됩니다.
맞춤 알림을 제공하려면
MediaNotification.Provider
드림
대상: DefaultMediaNotificationProvider.Builder
또는 제공자 인터페이스의 맞춤형 구현을 생성하여 제공할 수 있습니다.
제공업체를 MediaSession
에 제공합니다.
setMediaNotificationProvider
콘텐츠 라이브러리 광고
MediaLibraryService
는 클라이언트를 허용하여 MediaSessionService
를 기반으로 빌드됩니다.
앱이 제공하는 미디어 콘텐츠를 탐색할 수 있습니다. 클라이언트 앱은
상호작용하려면 MediaBrowser
MediaLibraryService
과(와) 연결하시기 바랍니다.
MediaLibraryService
구현은
MediaSessionService
. 단, onGetSession()
에서는
MediaSession
대신 MediaLibrarySession
를 사용합니다. 다른 플랫폼과 비교했을 때
MediaSession.Callback
, MediaLibrarySession.Callback
에는
웹 브라우저에서 제공하는 콘텐츠를 브라우저 클라이언트가 탐색할 수 있도록 하는
제공합니다.
MediaSessionService
과 마찬가지로 MediaLibraryService
매니페스트를 실행하고 포그라운드 실행을 위한 FOREGROUND_SERVICE
권한 요청
서비스:
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaLibraryService"/>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
위의 예에는 두 MediaLibraryService
의 인텐트 필터가 모두 포함되어 있습니다.
이전 버전과의 호환성을 위해 기존 MediaBrowserService
를 사용합니다. 이
추가 인텐트 필터를 사용하면 MediaBrowserCompat
API를 사용하는 클라이언트 앱을 사용할 수 있습니다.
Service
기기를 인식하세요.
MediaLibrarySession
를 사용하면 콘텐츠 라이브러리를 트리에 제공할 수 있습니다.
단일 루트 MediaItem
로 구성됩니다. 트리의 각 MediaItem
에는
하위 MediaItem
노드 수 다른 루트를 제공하거나
다른 트리를 생성합니다. 예를 들어 사용자가
추천 미디어 항목 목록을 찾는 클라이언트로 돌아가면
루트 MediaItem
와 단일 수준의 하위 MediaItem
노드 포함
반면에 다른 클라이언트 앱으로 돌아가는 트리는
전체 콘텐츠 라이브러리에 추가할 수 있습니다.
MediaLibrarySession
만들기
MediaLibrarySession
MediaSession
API를 확장하여 콘텐츠 탐색 API를 추가합니다. 비교 대상
MediaSession
콜백,
MediaLibrarySession
콜백
다음과 같은 메서드를 추가합니다.
onGetLibraryRoot()
드림 클라이언트가 콘텐츠 트리의 루트MediaItem
를 요청할 때onGetChildren()
드림 클라이언트가 콘텐츠 트리에서MediaItem
의 하위 요소를 요청하는 경우onGetSearchResult()
드림 클라이언트가 콘텐츠 트리에서 검색결과를 요청할 때 쿼리
관련 콜백 메서드에는 LibraryParams
가 포함됩니다.
클라이언트 앱이 보내는 콘텐츠 트리 유형에 대한 추가 신호가 있는 객체
파악할 수 있습니다