개발모음집

오디오 포커스(Audio Focus) - 내 앱에서 음악 재생시 다른 앱 정지시키기 본문

Android

오디오 포커스(Audio Focus) - 내 앱에서 음악 재생시 다른 앱 정지시키기

void 2017. 8. 10. 02:07

개념 설명 페이지에서 우선 오디오 포커스가 뭔지 알아보자.

(더 자세하고 문서화된 느낌의 페이지도 있다.)


개념적으로 중요한 부분만 발췌하자면

A 가 음악을 play 하려고 할 때 먼저 Audio Framework 로부터 Audio Focus 를 얻어옵니다 (Request AudioFocus- GAIN). 이때 Audio Framework 는 A 가 음악을 재생해도 되면 Audio Focus 를 A 에게 줍니다 (Grant AudioFocus). 그러다가 B 가 알람을 울릴려고 똑같은 방식으로 Audio Framework 에세 Audio Focus 를 요청합니다. 이때 Audio Framework 은 B 가 우선순위가 더 높다가 판단이 되면 B 에게 Audio Focus 를 주고 (이렇게 되면 A도 Audio Focus 를 갖고, B 도 갖고 있는 상황이 되기에), A 에게 너는 Audio Focus 를 잃었다는 (LOSS) 것을 알립니다.


AudioFocus에는 포커스를 얻는 상황과 잃는 상황이 있는데 

각각 3가지 종류가 있다.


[GAIN]

AUDIOFOCUS_GAIN

AUDIOFOCUS_GAIN_TRANSIENT

AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK


[LOSS]

AUDIOFOCUS_LOSS

AUDIOFOCUS_LOSS_TRANSIENT

AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK\



이것에 대한 코드는 스택오버플로우에 써있다.



// 오디오 포커스
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

int focusResult = am.requestAudioFocus(focusChangeListener,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN); // 이건 focusChangeListener를 보면 알 수 있다.

if (focusResult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // 오디오 써도 된다는 허락을 맡게 되면

재생 / 일시정지 코드
}

위코드는 클릭이벤트를 받거나 그럴 때 쓰는 거..


// 오디오 포커스
focusChangeListener =
new AudioManager.OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case (AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK):
// Lower the volume while ducking.
mediaPlayer.setVolume(0.2f, 0.2f);
break;
case (AudioManager.AUDIOFOCUS_LOSS_TRANSIENT):
mediaPlayer.pause();
break;

case (AudioManager.AUDIOFOCUS_LOSS):
mediaPlayer.stop();
break;

case (AudioManager.AUDIOFOCUS_GAIN):
// Return the volume to normal and resume if paused.
mediaPlayer.setVolume(1f, 1f);
mediaPlayer.start();
break;
default:
break;
}
}
};