Mini Media Player
Wallpad에서는 SDK 음악 플레이어가 닫힌 후에는 Wallpad 화면에서 더 이상 미디어를 제어할 수 없고, 음성 명령으로만 제어할 수 있습니다. 이를 해결하기 위해, Wallpad 버전의 Kakao i Agent SDK는 카카오 i 플랫폼에서 재생 중인 미디어 정보를 SDK가 아닌 SDK 외부에 보여주는 Mini Media Player의 구현을 지원합니다.
Mini Media Player 구현 시, Wallpad Launcher에 Viewer 형태로 추가하거나 또는 Notification을 통해 구현하는 방법을 권장합니다.
Mini Media Player 구현 시, ExternalMediaSessionManager
클래스의 Intent Action이 사용됩니다.
ExternalMediaSessionManager
클래스의 Intent Action
Intent Action | 설명 |
---|---|
com.kakao.i.sdk.agent.ACTION_REQUEST_MEDIA_SESSION_TOKEN | Media Session Token 요청 시 |
com.kakao.i.sdk.agent.ACTION_MEDIA_SESSION_CHANGED | Media Session Token 변경 시 |
com.kakao.i.sdk.agent.ACTION_FINISH_MEDIA_SESSION | Media Session 종료 시 |
안내
- Media Session의 상수는
sessionToken
입니다.- Mini Media Player는 Google Developers 사이트의 MediaControllerCompat 방식을 기반으로 합니다.
구현 방법
SDK에서 재생중인 Media Session 정보는 Context에 등록된 Receiver를 통해 Broadcast를 수신할 수 있습니다.
-
BroadcastReceiver
인스턴스를 생성합니다.코드예제BroadcastReceiver 인스턴스 생성
val br: BroadcastReceiver = BroadcastReceiver()
-
IntentFilter
를 생성하고registerReceiver(BroadcastReceiver, IntentFilter)
를 호출합니다.코드예제IntentFilter
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION).apply { addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED) } registerReceiver(br, filter)
-
Media Session Token 변경을 위해
com.kakao.i.sdk.agent.ACTION_MEDIA_SESSION_CHANGED
를 Receiver로 구현하여 등록합니다.코드예제Receiver 구현
private final BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (ACTION_KAKAO_I_MEDIA_SESSION_CHANGED.equals(intent.getAction())) { // Kakao i 의 Media session token이 변경되었을 경우 // - Media session이 존재할 경우 : token = NOT null // - Media session이 존재하지 않을 경우 : token = null final MediaSessionCompat.Token token = intent.getParcelableExtra(EXTRA_SESSION_TOKE N); if (token != null) { onMediaSessionCreated(token); } else { onMediaSessionDestroyed(); } } } };
코드예제Receiver 등록
// Kakao i의 Media session이 변경될 때마다 전송되는 intent 에 대해 receiver 등록 context.registerReceiver(receiver, new IntentFilter(ACTION_KAKAO_I_MEDIA_SESSION_CH ANGED));
-
SendBroadcast
메서드로 Media Session Token 요청을 전송합니다.코드예제Media Session Token 요청
context.sendBroadcast(new Intent(ACTION_KAKAO_I_REQUEST_MEDIA_SESSION_TOKEN));
-
응답값에 Media Session의 상수(sessionToken)가 있는 경우, Media Session을 생성합니다.
- Media Session 상수가 없는 경우에는 Media Session이 종료됩니다.
코드예제Media Session 생성
private final BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (ACTION_KAKAO_I_MEDIA_SESSION_CHANGED.equals(intent.getAction())) { // Kakao i의 Media session token이 변경되었을 경우 // - Media session이 존재할 경우 : token = NOT null // - Media session이 존재하지 않을 경우 : token = null final MediaSessionCompat.Token token = intent.getParcelableExtra (EXTRA_SESSION_TOKEN); if (token != null) { onMediaSessionCreated(token); } else { onMediaSessionDestroyed(); } } } };
미디어 정보 확인
미디어 상태 정보와 미디어 곡 정보는 다음의 메서드를 호출하여 확인할 수 있습니다.
표미디어 정보 확인항목 | 메서드 |
---|---|
미디어 상태 정보 | onPlaybackStateChanged(PlaybackStateCompat state) |
미디어 곡 정보 | onMetadataChanged(MediaMetadataCompat metadata) |
Sample Code
다음은 미디어 상태 정보를 확인하는 예제 코드입니다.
코드예제미디어 정보 확인
public void onPlaybackStateChanged(PlaybackStateCompat playbackState) {
final int state = playbackState.getState();
if (state == PlaybackStateCompat.STATE_PAUSED) {
//일시정지
} else if(state == PlaybackStateCompat.STATE_STOPPED) {
//정지
} else if(state == PlaybackStateCompat.STATE_PLAYING) {
//재생중
} ...
}
public void onMetadataChanged(MediaMetadataCompat metadata) {
final MediaDescriptionCompat description = metadata.getDescription();
description.getTitle(); //곡명
description.getSubtitle(); // 가수명
}
미디어 제어
미디어 제어는 MediaControllerCompat.TransportControls
객체를 사용합니다.
코드예제미디어 제어
public void play(){
if (mediaController != null) {
mediaController.getTransportControls().play();
}
}
public void pause() {
if (mediaController != null) {
mediaController.getTransportControls().pause();
}
}
public void prev() {
if (mediaController != null) {
mediaController.getTransportControls().skipToPrevious();
}
}
public void next() {
if (mediaController != null) {
mediaController.getTransportControls().skipToNext();
}
}
안내
MediaControllerCompat에 대한 자세한 설명은 Google Developers 사이트를 참고하시기 바랍니다.
미디어 종료
Mini Media Player의 [X] 버튼 등을 클릭하여 Media Session을 종료할 경우, ACTION_KAKAO_I_FINISH_MEDIA_SESSION
을 사용하여 SendBroadcast
메서드를 호출합니다.
코드예제미디어 종료
public void finish() {
context.sendBroadcast(new Intent(ACTION_KAKAO_I_FINISH_MEDIA_SESSION));
}
안내
SendBroadcast에 대한 자세한 설명은 Google Developers 사이트를 참고하시기 바랍니다.
앱 아이콘 변경
Mini Media Player 기능을 별도의 앱으로 구현한 경우, Android 기본 아이콘 이미지가 아닌 카카오 i 아이콘을 다운로드하여 사용할 수 있습니다.
- 카카오 i 플레이어 아이콘 이미지: 다운로드
그림앱 아이콘 변경