미디어 세션 사용하기
https://developer.android.com/guide/topics/media-apps/working-with-a-media-session
미디어 세션은 관리하는 플레이어와 함께 산다. 액티비티나 서비스에서 onCreate() 메소드에서 미디어 세션을 생성하고 초기화하여 미디어세션과 이와 연관된 플레이어를 갖는다.
일러두기: 미디어 앱을 작성하기 위한 최상의 행위는 미디어 컴팻 라이브러리를 사용하는 것이다. 이 문서상의 "미디어 세션" 은 MediaSessionCompat 을 "미디어 컨트롤러" 는 MediaControllerCompat 을 의미한다.
미디어 세션 초기화하기
새롭게 생성된 미디어 세션은 캐퍼빌리티가 없다. 다음 단계를 통해 세션을 초기화해야 한다.
- 플래그를 설정해 미디어 세션이 미디어 컨트롤러와 미디어 버튼에 콜백을 받도록한다.
- PlaybackStateCompat 의 인스턴스를 생성하고 초기화하며 세션에 할당한다. 플래이백 상태는 세션을 통해 변화되며 그래서 PlaybackStateCompat.Builder 를 재사용을 위해 캐싱하는 것을 추천한다.
- MediaSessionCompat.Callback 의 인스턴스를 생성하고 세션에 할당한다.
세션을 가지고 있는 액티비티나 서비스의 onCreate() 에서 미디어 세션을 생성하고 초기화한다.
앱이 새롭게 초기화되었을 때 (중단되었을 때) 미디어 버튼에 반응하려면 PlaybackState 는 반드시 미디어 버튼을 보내는 인텐트에 맞춘 플레이 액션을 포함한다. 이 것이 초기화 중에 세션상테에 ACTION_PLAY가 할당된 이유다. For more information, see Responding to Media Buttons.
플레이백 상태와 메타데이터 유지하기
미디어 세션의 상태를 표현하는 두개의 클래스가 있다.
PlaybackStateCompat 클래스는 플레이어의 현 연산 상태를 나타낸다. 이는 다음을 포함한다.
- 전달 상태 (플레이어가 재생중인지/일시정지중인지/버퍼링중인지를 나타낸다. getState() 참고)
- 에러 코드와 옵셔널 에러 메시지를 가용할 때 얻을 수 있다 (See getErrorCode() and read States and errors, below.)
- 플레이어 포지션
- 표시상태에서 다룰 수 있는 유효한 컨트롤러 액션들
MediaMetadataCompat 클래스는 재생중인 매터리얼을 나타낸다.
- 아티스트, 앨범, 그리고 트랙의 이름
- 트랙 듀레이션
- 락스크린에서의 앨범 아트워크. 이미지는 최대 320x320dp 크기를 가진다 (만약 더 크면, 스케일 다운됨)
- 아트워크의 큰 버전을 가리키는 ContentUris 의 인스턴스
플레이어 상태와 메타데이터는 미디어 세션유지되는 동안 변경될 수 있다. 상태나 메타데이터가 변하는 매번 각 클래스를 위해 연계된 빌더인 PlaybackStateCompat.Builder() 또는 MediaMetadataCompat.Builder()를 사용하고 setPlaybackState() 또는 setMetadata() 를 사용해 미디어 세션으로 새로운 인스턴스를 건낸다. 자주 실행됨에 따른 메모리 소비를 줄이려면 빌더를 한번만 생성하고 세션 실행동안 이 들을 재사용할 수도 있다.
상태와 에러
PlaybackState 는 세션의 플레이백 상태(getState())의 구별된 값을 포함하는 객체이며 필요한 경우 연관된 에러코드(getErrorCode())가 있다. 에러는 치명적이거나 그렇지 않을 수 있다.
플레이백이 인터럽트되면 치명 에러를 발생시키며 트랜스포트 상태는 STATE_ERROR 그리고 setErrorMessage(int, CharSequence) 로 연관 에러를 지정한다. 재생이 에러에 의해 블록되기만하면 PlaybackState 는 STATE_ERROR와 에러를 보고 해야 한다.
비치명에러는 앱이 요청을 다루지 못할 때 발생하나 재생을 지속할 수 있다. PlaybackState가 에러코드를 가짐에도 트랜스포트가 정상상태에 남아 있을 수 있다. (STATE_PLAYING과 같은) 예를 들어, 만약 마지막 노래가 재생되고 사용자가 다음 노래로 스킵했다면 플레이백은 지속되지만 PlaybackState 는 ERROR_CODE_END_OF_QUEUE 에러코드를 설정해 setPlaybackState() 를 호출한다. 세션에 붙여진 미디어 컨트롤러는 onPlaybackStateChanged() 콜백을 받고 사용자에게 무슨일이 발생했는지 설명한다. 비치명적 에러는 이 것이 발생할 때 한번만 보고되어야 한다. 다음번에 세션은 PlaybackState 를 업데이트하여 같은 비치명 에러를 할당하지 않게 한다. (새로운 요청에의해 에러가 발생한게 아니라면)
미디어 세션 락 스크린
안드로이드 4.0 부터 시스템은 미디어 세션의 재생 상태와 메타데이터에 접근할 수 있다. 이 것은 락스크린이 어떻게 미디어 컨트롤과 아트워크를 보여주는지에 대한 것이다. 작용은 안드로이드 버전에 따라 달라질 수 있다.
앨범 아트워크
안드로이드 4.0 이상에서 락 스크린 배경을 앨범 아트워크를 표시할 수 있는데 미디어 세션 메타데이터가 백그라운드 비트맵을 포함하는 경우이다.
트랜스포트 컨트롤
안드로이드 4.0에서 4.4 에서는 미디어 세션이 활성화되어있고 미디어세션 메타데이터가 백그라운드 비트맵을 포함하면 락스크린은 자동적으로 트랜스포트 컨트롤을 보여준다.
안드로이드 5.0 이상에서는 시스템은 트랜스포트 컨트롤을 제공하지 않는다. 대신 트랜스포트 컨트롤을 보여주려면 MediaStyle 알림을 사용해야 한다.
커스텀 액션 추가하기
addCustomAction() 으로 커스텀액션을 추가할 수 있다. 예를 들어, 섬업 액션을 구현하는 제어는 다음과 같다.
stateBuilder.addCustomAction(
PlaybackStateCompat.CustomAction.Builder(
CUSTOM_ACTION_THUMBS_UP,
resources.getString(R.string.thumbs_up),
thumbsUpIcon
).run {
setExtras(customActionExtras)
build()
}
)
See the Universal Music Player for a complete example.
You respond to the action with onCustomAction().
override fun onCustomAction(action: String, extras: Bundle?) {
when (action) {
CUSTOM_ACTION_THUMBS_UP -> {
..
}
}
}
Also see the Universal Music Player.
미디어 세션 콜백
미디어 세션 콜백 메소드는 onPlay(), onPause(), 그리고 onStop() 이다. 플레이어를 제어하기 위해 어디에 코드를 추가했는지에 따라 달라진다.
런타임에서 (onCreate()) 세션의 콜백을 초기화하고 설정함에 따라 앱은 다른 프레이어와 장치와 시스템 레벨에 따른 적절한 콜백/플레이어를 선택하는 대체 콜백을 정의할 수 있다. 앱의 나머지에서 변경할 필요없이 플레이어를 변경할 수 있다. 예를 들어, 안드로이드 4.1 이상일 때는 ExoPlayer를 그 이전 시스템에는 MediaPlayer를 사용할 수 있다.
플레이어를 제어하고 미디어 세션 상태 트랜지션을 관리하는 것과 별도로 콜백은 앱의 기능을 활성 비활성 하고 다른 앱과 장치 하드웨어와의 상호작용애대한 방법을 제어한다. (See Controlling Audio Output).
미디어 세션 콜백 메소드의 구현은 앱의 구조에 의존한다. 별도로 구별딘 페이지에서 오디오 앱과 비디오 앱의 콜백을 어떻게 사용하는지 각 형식의 구현은 어떻게 되어야하는지 설명을 살펴본다.
태그 : android, mediasession
최근 덧글