Before 2022/Android

안드로이드 Audio Focus를 이용하여 다른 앱 음악 일시 정지 시키기

Eljoe 2018. 12. 28. 15:55
private void audioFocus(Context context) {
        //메모리 누수 이슈로 AudioManager는 Application의 Context를 가져올 것!
        AudioManager mAudioManager = (AudioManager) context.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

        if(mAudioManager != null) {
            //첫 번째 인자로 listener를 줘야하지만, 음악 일시정지만 하고 싶은 경우엔 null로 준다.
            int result = mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

            if(result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
                Log.d(TAG, "not get audio focus");
            }
        }
    }
백그라운드(다른 앱)에서 음악이 재생 중일 때 "AUDIOFOCUS_GAIN"을 주면 우선 순위가 이동되어 다른 앱에서 실행중이던 음악이 일시 중단된다.

2019. 03. 15


위와 같은 기존 형태의 requestAudioFocus가 API 26 레벨에서 Deprecated되었다.

requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint)


따라서 새로운 형태의 requestAudioFocus(AudioFocusRequest focusRequest)로 아래와 같은 코틀린 소스를 첨부한다.

val mAudioManager: AudioManager = context.applicationContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
mAudioManager.requestAudioFocus(AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) // 오디오 포커스를 영속적으로 획득
				.setAudioAttributes(AudioAttributes.Builder()
						.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
						.setUsage(AudioAttributes.USAGE_MEDIA) 
						.build())
				.setAcceptsDelayedFocusGain(true)
				.setOnAudioFocusChangeListener {} // 위 소스와 마찬가지 이유로 listner 구현 안함.
				.build())