일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- SWIFTUI
- Koin
- junit
- GCP
- paging
- 테스트 자동화
- Reactive
- Animation
- mvvm
- list
- Observable
- SwiftUI Tutorial
- 동영상
- rx
- RxKotlin
- MotionLayout
- MediaPlayer
- mysql
- node
- android13
- Android
- google play
- MediaSession
- Android 13
- Kotlin
- liveData
- databinding
- node.js
- 인앱결제
- PagingLib
- Today
- Total
봄날은 갔다. 이제 그 정신으로 공부하자
동영상 앱 빌드 - part3 본문
이번 글에서는 동영상앱을 만드는데 꼭 필요한 구성요소인 MediaController와 MediaSession에 대해 설명합니다.
* 참고 사이트:
https://developer.android.com/guide/topics/media-apps/video-app/building-a-video-app
일반 동영상 플레이어는 실행되는 동안 항상 컨트롤과 동영상 콘텐츠를 표시해야 합니다.
백그라운드 or UI없이는 작동할 수 없습니다.
따라서 UI, Player, MediaSession, MediaController가 포함된 단일 활동으로 앱을 빌드하는 것이 좋습니다.
동영상 플레이어 Activity 빌드
MediaSession과 MediaController가 포함된 Activity를 빌드하는 방법에 대해 설명합니다.
Activity는 onCreate() lifecycle Callback을 수신하면 아래 단계를 실행해야 합니다.
- MediaSession을 만들고 초기화 합니다.
- MediaSession Callback을 설정합니다.
- Player가 보이지 않을 때 Media Button Event가 플레이어를 다시 시작하지 않도록 MediaSession의 Media Button Receiver를 null로 설정합니다.
해당 내용은 Android 5.0(API Level 21) 이상의 기기에만 영향을 줍니다.
- MediaController를 만들고 초기화합니다.
아래 onCreate()함수는 위 설명한 처리에 대한 예시 입니다.
private latent var mediaSession: MediaSessionCompat
public override fun onCreate(saveInstanceState: Bundle?){
super.onCreate(savedInstanceSatate)
// Create a MediaSessonCompat
mediaSession = MediaSessionCompat(this, TAG).apply{
// Enable callbacks from MediaButtons and TransportControls
setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
// Do not let MediaButtons restart the player when the app is not visible
setMediaButtonReceiver(null)
// Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player
val stateBuilder = PlaybackStateCompat.Builder().setActions(PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PLAY_PAUSE)
setPlaybackState(stateBuilder.build())
// MySessionCallback has methods that handle callbacks from a media controller
setCallback(MySessionCallback())
}
// Create a MediaControllerCompat
MediaControllerCompat(this, mediaSession).also { mediaController ->
MediaControllerCompat.setMediaController(this, mediaController)
}
}
앱이 종료되거나 bockground로 가게되면 Activity는 onPause()와 onStop() 콜벡을 연속으로 수신합니다. 플레이어가 재생 중인 경우, Activity가 사라지기 전에 플레이어를 중지해야 합니다.
어떤 콜백을 사용할지는 실행 중인 Android 버전에 따라 다릅니다.
Android 6.0(API Level 23)이하에서는 onStop()의 호출 시점이 보장되지 않습니다. Activity가 사라지고 5sec 후에 호출될 수도 있습니다. 따라서 Android 버전 7.0이전에서는 앱이 onPause()에서 재생을 중지해야 합니다.
즉, 아래와 같이 Android 버전에 따라 플레이어 중지 시점을 다르게 처리해야 합니다.
- Android 버전 6.0 이하: onPause()에서 플레이어를 중지
- Android 버전 7.0 이상: onStop()에서 플레이어를 중지
- 버전에 상관 없이 onDestory()에서 플레이어 해제 및 정리
MediaSession Callback
미디어 세션 콜백 메서드가 미디어 세션 및 기타 앱 구성 요소(예: Alarm, Broadcast Receiver)를 관리하는 방법에 대해 설명합니다.
동영상 앱은 MediaSession과 MediaController를 동일한 Activity에서 실행하므로 서비스 호출이 없으며 NotificationManager를 통해 알림이 처리됩니다.
아래 표는 각 콜백 메서드에서 다양한 기능이 제어되는 방식을 보여줍니다.
구분 |
onPlay() |
onPause() |
onStop() |
Audio Focus |
OnAudioFocusChangeListener에서 requestFocus()가 전달됨. 항상 requestFocus()를 먼저 호출하고 포커스가 허용된 경우에만 진행. |
|
abandonAudioFocus() |
Media Session |
setActive(true) - 메타데이터 및 상태 업데이트 |
- 메타데이터 및 상태 업데이트 |
setActive(false) - 메타데이터 및 상태 업데이트 |
Player Implementation |
플레이어 시작 |
플레이어 일시 중지 |
플레이어 중지 |
Becoming Noise |
BroadcastReceiver 등록 |
BroadcastReceiver 등록 취소 |
|
Notifications |
알림 표시 |
알림 업데이트 |
|
'학습' 카테고리의 다른 글
오디오 출력 Handling - part5 (0) | 2021.01.07 |
---|---|
Media button 응답 처리 - part4 (0) | 2021.01.06 |
미디어 세션 사용 - part2 (0) | 2020.12.31 |
미디어 앱 아키텍쳐 개요 - part1 (0) | 2020.12.30 |
여러가지 방식으로 List 만들어보기 - part 2 (0) | 2020.12.23 |