Kakao i Agent SDK::Wallpad::Mini Media Player 구현

페이지 이동경로

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를 수신할 수 있습니다.

  1. BroadcastReceiver 인스턴스를 생성합니다.

    코드예제BroadcastReceiver 인스턴스 생성

    val br: BroadcastReceiver = BroadcastReceiver()
    

  2. IntentFilter를 생성하고 registerReceiver(BroadcastReceiver, IntentFilter)를 호출합니다.

    코드예제IntentFilter

    val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION).apply {
            addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED)
        }
        registerReceiver(br, filter)
    

  3. 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));
    

  4. SendBroadcast 메서드로 Media Session Token 요청을 전송합니다.

    코드예제Media Session Token 요청

    context.sendBroadcast(new Intent(ACTION_KAKAO_I_REQUEST_MEDIA_SESSION_TOKEN));
    

  5. 응답값에 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 플레이어 아이콘 이미지: 다운로드

앱 아이콘 변경 그림앱 아이콘 변경

이 문서가 만족스러운 이유를 알려주세요.
이 문서에 아쉬운 점을 알려주세요.
평가해주셔서 감사합니다.

더 자세한 의견은 contact.dkt@kakaocorp.com 으로 제보해주세요.