본문 바로가기

OS/Android

Android Media Button 대응

반응형

Android 12 단말기에서 미디어 버튼 기능이 안된다는 이슈가 있었다.

라디오 앱에서 미디어 버튼 기능은 꽤나 중요한 이슈이기 때문에 바로 확인해보았다.

	public void onReceive(Context context, Intent intent) {
		String strAct = intent.getAction();

		if (!strAct.equals(Intent.ACTION_MEDIA_BUTTON))
			return;

		KeyEvent evt = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);

		if (evt == null) {
			return;
		}
	}

기존 코드는 ACTION_MEDIA_BUTTON 액션을 등록하여 키 이벤트를 통지 받는 방식으로 Android 10 단말기와 Android 12 단말기로 테스트를 진행해보았다.

테스트 결과 Android 10 단말기에서는 문제 없이 작동 되지만 Android 12 단말기에서는 Bundle이 빈값으로 통지되고 있다. 코드 실수가 있을 수 있으니 SDK에 있는 MediaButtonReceiver를 등록해 테스트 해봤지만 마찬가지로 null이 통지 되었다.

시스템쪽에 무언가 변경 됐을 거라 생각해 공식 문서를 찾아보았고 미디어 버튼 관련 이벤트들을 MediaSession에서 관리한다는 내용을 확인 할 수 있었다. MediaSession 관련 문서가 설명이 불친절해서 샘플 코드 작성하는데 꽤나 애먹었지만 어쨌든 샘플코드는 다음과 같다.

ComponentName componentName = new ComponentName(this, HeadsetButtonSystemReceiver.class);
PlaybackState.Builder stateBuilder = new PlaybackState.Builder()
	.setActions(PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE);

MediaSession mediaSession = new MediaSession(this, getString(R.string.app_name));
mediaSession.setPlaybackState(stateBuilder.build());
mediaSession.setCallback(new MediaSession.Callback()
{
	@Override
	public boolean onMediaButtonEvent(@NonNull Intent mediaButtonIntent)
	{
		return super.onMediaButtonEvent(mediaButtonIntent); // 키이벤트 받는 곳
	}
});
mediaSession.setMediaButtonBroadcastReceiver(componentName);
mediaSession.setActive(true);

 

기존에 사용하던 리시버를 미디어 세션에 등록하여 이벤트들을 콜백으로 받아 오는 방식이다.

그리고 PlaybackState에는 재생, 중지 외에도 다음곡, 이전곡과 같은 액션들이 있으니 본인이 만드는 앱에 맞게 등록하면 된다.

반응형

'OS > Android' 카테고리의 다른 글

Android automotive 테스트  (0) 2023.05.15
원스토어 배포 이슈  (0) 2022.11.29
Android 위젯 (Widget)  (0) 2022.01.04
Android Bundle(.aab) release crash 삽질  (0) 2021.08.27
삼성폰 HLS 재생 안됨 디버깅  (0) 2021.06.07