봄날은 갔다. 이제 그 정신으로 공부하자

미디어 세션 사용 - part2 본문

학습

미디어 세션 사용 - part2

길재의 그 정신으로 공부하자 2020. 12. 31. 11:01

미디어 세션은 관리하는 플레이어와 함께 움직입니다. 미디어 세션 및 관련 플레이어를 소유한 활동 또는 서비스의 onCreate() 메서드에서 미디어 세션을 만들고 초기화해야 합니다.

 

* 참고

   미디어 앱을 개발하는 가장 좋은 방법은 media-compat 라이브러리를 사용하는 것 입니다.

   이 글에서 언급되는 “미디어 세션”은 MediaSessionCompat의 인스턴스를 의미하고 “미디어 컨트롤러”는 MediaCOntrollerCompat의

   인스턴스를 의미합니다.

 

* 참고 사이트:

   https://developer.android.com/guide/topics/media-apps/working-with-a-media-session

 

미디어 세션 초기화

새로 만든 미디어 세션에는 기능이 없으므로 아래 단계에 따라 세션을 초기화해야 합니다.

  • 미디어 세션이 미디어 컨트롤러 및 미디어 버튼에서 콜백을 수신할 수 있도록 플래그를 설정합니다.
  • PlaybackStateCompat의 인스턴스를 만들고 초기화한 다음 세션에 할당합니다. 재생 상태는 세션 전체에서 변경되므로 재사용을 위해 PlaybackStateCompat.Builder를 캐시하는 것이 좋습니다.
  • MediaSessionCompat.Callback의 인스턴스를 만들고 세션에 할당합니다.

세션을 소유한 Activity 또는 Service의 onCreate() 메서스에서 미디어 세션을 만들고 초기화해야 합니다.

앱이 새로 초기화되거나 중지될 때 “미디어 버튼”이 작동하려면 미디어 버튼이 전송하는 Intent와 일치하는 재생 작업이 PlaybackState에 포함되어 있어야 합니다. 이러한 이유로 초기화 중에 ACTION_PLAY가 세션 상태에 할당됩니다.

 

재생 상태 및 메타데이터 유지 관리

미디어 세션의 상태를 나타내는 두가지 클래스가 있습니다.

 

PlaybackStateCompat 

PlaybackStateCompat 클래스는 플레이어의 현재 작동 상태를 설명합니다.

  • 전송 상태(재생 중 / 일시중지 / 버퍼링 등의 플레이어 상태, getState() 참조)
  • 오류 코드 및 선택사항인 오류 메시지(해당되는 경우)
  • 플레이어 위치
  • 현재 상태에서 처리할 수 있는 유효한 컨트롤러 작업

MediaMetadataCompat 

MediaMetadataCompat 클래스는 재생 중인 자료를 설명합니다.

  • 아티스트, 앨범 및 트랙의 이름
  • 트랙 길이
  • 잠금 화면에 표시할 앨범 아트워크, 이미지는 최대 크기 320*320dp의 비트맵(더 큰 경우, 축소됨.)
  • 아크워크의 더 큰 버전을 가리키는 ContentUris의 인스턴스

 

플레이어 상태와 메타데이터는 미디어 세션의 수명 동안 변경될 수 있습니다. 상태 또는 메타데이터가 변경될 때마다 각 클래스인 PlaybackStateCompat.Builder() 또는 MediaMetadataCompat.Builder()에 해당하는 빌더를 사용한 다음, setPlaybackState() 또는 setMetaData()를 호출하여 새 인스턴스를 미디어 세션에 전달해야 합니다. 빈번한 작업으로 인한 전체 메모리 소비를 줄이려면 빌더를 한 번만 만들고 세션 수명 동안 재사용하는 것이 좋습니다.

 

상태 및 오류

PlaybackState는 세션의 재생 상태(getState())와 필요한 경우 관련 오류 코드(getErrorCode())에 관한 별도의 값을 포함하는 객체입니다. 오류는 심각할 수 있고 심각하지 않을 수도 있습니다.

재생이 중단될 때마다 심각한 오류가 발생합니다. 전송 상태를 STATE_ERROR로 설정하고 setErrorMessage(Int, CharSequence)와 관련된 오류를 지정하세요. 오류에 의해 재생이 차단되는 한 PlaybackState는 계속해서 STATE_ERROR 및 오류를 보고해야 합니다.

앱이 요청을 처리할 수는 없지만 계속해서 재생할 수 있는 경우에는 심각하지 않은 오류가 발생합니다. 전송은 “정상” 상태(예: STATE_PLAYING)로 유지되지만 PlaybackState는 오류를 가지고 있습니다. 예를 들어, 마지막 곡이 재생 중이고 사용자가 다음 곡으로 건너뛰기를 요청하면 재생을 계속할 수 있지만, 오류 코드가 ERROR_CODE_END_OF_QUEUE인 새 PlaybackState를 만든 다음 setPlaybackState()를 호출해야 합니다. 세션에 연결된 미디어 컨트롤러는 onPlaybackStateChanged() 콜백을 수신하고 무슨 일이 일어났는지를 사용자에게 설명합니다. 심각하지 않은 오류는 발생 시점에 한번만 보고해야 합니다. 다음에 세션 업데이트 시 PlaybackState는 심각하지 않은 동일한 오류를 다시 설정하지 않습니다.

 

미디어 세션 잠금 화면

Android 4.0(API Level 14)부터 시스템은 미디어 세션의 재생 상태와 메타데이터에 액세스할 수 있습니다. 이 방법으로 잠금 화면이 미디어 컨트롤과 아트워크를 표시할 수 있습니다. 단, Android 버전 및 디바이스 제조사에 따라 행동이 다를 수 있습니다.

 

앨범 아트워크

ANdroid 4.0(API Level 14) 이상에서는 미디어 세션 메타데이터에 배경 비트맵이 포함된 경우에만 잠금 화면의 배경에 앨범 아트워크가 표시됩니다.

 

전송 컨트롤

Android 4.0(API Level 14)부터 Android 4.4(API Level 19)까지는 미디어 세션이 활성화되고 미디어 세션 메타데이터에 백그라운드 비트맵이 포함되면 잠금 화면에 전송 컨트롤이 자동으로 표시됩니다.

Android 5.0(API Level 21) 이상에서는 시스템이 잠금 화면에 전송 컨트롤을 제공하지 않습니다. 대신 전송 컨트롤을 표시하려면 MediaStyle알림을 사용해야 합니다.

 

맞춤 작업 추가

전체 예제 링크

https://github.com/android/uamp/blob/f3154af7ac972ee9b7b1fd32ca3c935e02268a18/mobile/src/main/java/com/example/android/uamp/playback/PlaybackManager.java#L150-L171

 

addCustomAction()으로 맟춤 작업을 추가할 수 있습니다. 예를 덜어 컨트롤을 추가하여 좋아요 작업을 구현하는 방법은 다음과 같습니다.

stateBuilder.addCustomAction(
            PlaybackStateCompat.CustomAction.Builder(
                    CUSTOM_ACTION_THUMBS_UP,
                    resources.getString(R.string.thumbs_up),
                    thumbsUpIcon
            ).run {
                setExtras(customActionExtras)
                build()
            }
    )

 

onCustomAction()으로 작업에 응답 합니다.

override fun onCustomAction(action: String, extras: Bundle?) {
        when(action) {
            CUSTOM_ACTION_THUMBS_UP -> {
                ...
            }
        }
    }

 

미디어 세션 콜백

기본 미디어 세션 콜백 메서드는 onPlay(), onPause() 및 onStop() 입니다. 여기에서 플레이어를 제어하는 코드를 추가합니다.

런타임에 (onCreate()) 세션의 콜백을 인스턴스화하고 설정하므로 앱에서 다른 플레이어를 사용하는 대체 콜백을 정의하고 기기 또는 시스템 수준에 따라 적절한 콜백/플레이어 조합을 선택할 수 있습니다. 앱의 나머지를 변경하지 않은 채 플레이어를 변경할 수 있습니다. 예를 들어 Android 4.1(API Level 16)이상에서 실행할 경우 ExoPlayer를 사용하고 그 이전 시스템에서는 MediaPlayer를 사용할 수 있습니다.

콜백은 플레이어를 제어하고 미디어 세션 상태 전환을 관리하는 것 외에도 앱의 기능을 사용 설정 및 사용 중지하고 앱의 다른 앱 및 기기 하드웨어와 상호작용하는 방식을 제어합니다.

미디어 세션 콜백 메서드의 구현은 앱의 구조에 따라 다릅니다.

 

Comments