Audio Focus는 여러 애플리케이션이 오디오 출력을 동시에 사용하는 것을 조절하는 Android 메커니즘입니다. 소리 겹침을 방지합니다: 한 앱이 재생을 시작하면 시스템이 자동으로 다른 앱의 소리를 낮추거나 일시 중지합니다. Android Developer Guide, 2026에 따르면, Audio Focus는 오디오를 재생하는 모든 앱에 필수입니다 — 이것이 없으면 Google Play가 업데이트를 거부할 수 있습니다.
핵심 사항
Audio Focus는 Android의 중앙 집중식 오디오 중재 시스템입니다. 앱이 포커스를 요청하면 시스템이 활성 포커스 “소유자”가 있는지 확인하고 소유자에게 손실 알림을 보냅니다. 소유자는 포커스 유형에 따라 볼륨을 낮추거나(덕), 재생을 일시 중지하거나 무시할 수 있습니다.
Android 8.0 이전에는 포커스가 AudioManager.requestAudioFocus(callback, stream, durationHint)를 통해 관리되었습니다. Android 8.0부터는 AudioFocusRequest가 도입되어 요청 유형과 자동 포커스 복원을 지정할 수 있게 되었습니다. Android 12에서는 메커니즘이 강화되어 Google Play에 게시하려면 모든 미디어 플레이어가 포커스를 올바르게 처리해야 합니다.
Google I/O 2024에 따르면, 오디오 앱 리뷰에서 사용자 불만의 약 15%가 소리 겹침과 관련되어 있습니다. 올바른 Audio Focus 구현은 이 문제를 해결하고 청취 시간에서 사용자 경험을 30% 향상시킵니다.
Audio Focus가 자동으로 재생을 제어하지 않는다는 점을 이해하는 것이 중요합니다. 포커스 이벤트에 대해 앱에 알릴 뿐입니다. 앱이 직접 플레이어를 일시 중지할지, 볼륨을 낮출지 또는 계속 재생할지 결정합니다. 시스템이 강제하지 않습니다 — 이 아키텍처 결정은 개발자에게 맡겨집니다.
예외는 내비게이션 앱(Google Maps, Yandex Maps)입니다. AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 포커스 유형을 요청할 수 있으며, 기존 플레이어의 볼륨이 낮아지고 그 위에 음성 프롬프트가 재생됩니다. 프롬프트가 끝나면 플레이어가 자동으로 볼륨을 복원합니다.
시스템은 단일 활성 오디오 포커스 소유자를 유지합니다. 새 앱이 포커스를 요청하면 시스템이 우선순위를 결정하고 현재 소유자에게 이벤트를 보냅니다. 현재 소유자가 이벤트를 무시하고 계속 크게 재생하면 시스템이 제재를 가하지 않습니다 — 책임은 전적으로 플레이어에 있습니다.
포커스 요청에는 durationHint 매개변수가 포함되어 시스템에 예상 기간을 알려줍니다: AUDIOFOCUS_GAIN(긴 재생 — 음악, 팟캐스트), AUDIOFOCUS_GAIN_TRANSIENT(단기 — 알림음, 내비게이션), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK(기존 플레이어 볼륨을 낮출 수 있는 단기).
포커스 손실 시 앱은 세 가지 코드 중 하나를 받습니다: AUDIOFOCUS_LOSS(장기 손실 — 다른 앱이 음악을 시작함), AUDIOFOCUS_LOSS_TRANSIENT(일시적 손실 — 전화, 알림), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK(볼륨 감소 가능성이 있는 일시적 손실). 각 코드에는 고유한 대응이 필요합니다.
사용자가 앱 A에서 음악을 듣고 있습니다. 전화가 옵니다 — 앱 B(전화)가 AUDIOFOCUS_GAIN_TRANSIENT를 요청합니다. 시스템이 앱 A에 AUDIOFOCUS_LOSS_TRANSIENT를 보냅니다. 플레이어가 일시 중지됩니다. 전화가 끝난 후 앱 B가 포커스를 해제하고 시스템이 AUDIOFOCUS_GAIN을 통해 앱 A에 알립니다 — 플레이어가 재생을 재개합니다. 전체 체인은 50ms 미만이 소요됩니다.
올바른 durationHint를 선택하는 것은 Audio Focus를 구현할 때 중요한 결정입니다. 잘못된 유형 선택은 소리 겹침, 불필요한 플레이어 중지 또는 사용자 불만으로 이어집니다.
| 요청 유형 | 시나리오 | 소유자 반응 |
|---|---|---|
| AUDIOFOCUS_GAIN | 음악, 팟캐스트 시작 | AUDIOFOCUS_LOSS — 플레이어 중지 |
| AUDIOFOCUS_GAIN_TRANSIENT | 전화, 음성 알림 | AUDIOFOCUS_LOSS_TRANSIENT — 일시 중지 |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS 안내, 짧은 신호 | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — 볼륨 낮춤 |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | 음성 검색, 녹음 | AUDIOFOCUS_LOSS — 완전 중지 |
덕(Duck)은 보조 소리가 재생되는 동안 메인 플레이어의 볼륨을 20–30%로 일시적으로 낮추는 것입니다. Android는 AudioManager.adjustSuggestedStreamVolume을 통한 수동 덕킹 API를 제공하지만, 대부분의 플레이어는 자체 방식으로 덕킹을 구현합니다. Android 문서(2026)에 따르면 덕 처리는 3초를 넘지 않아야 하며, 그 후 볼륨이 복원됩니다.
Audio Focus를 올바르게 구현하려면 세 단계를 순차적으로 수행해야 합니다: 요청 생성, 재생 전 포커스 요청, 콜백에서 이벤트 처리. AndroidX 미디어의 AudioFocusRequestCompat을 사용하면 모든 Android 버전과의 호환성이 보장됩니다.
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val focusRequest = AudioFocusRequestCompat.Builder()
.setFocusGain(AudioManagerCompat.AUDIOFOCUS_GAIN)
.setOnAudioFocusChangeListener(focusChangeListener)
.build()
val result = AudioManagerCompat.requestAudioFocus(audioManager, focusRequest)
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
startPlayback()
}
포커스 요청은 사용자가 Play를 누를 때마다 재생을 시작하기 전에 수행되어야 합니다. 결과가 AUDIOFOCUS_REQUEST_GRANTED이면 재생을 시작합니다. DENIED이면 사용자에게 메시지를 표시하거나 포커스를 얻을 때까지 재생을 연기합니다.
private val focusChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
restoreVolume()
if (wasPlayingBeforeLoss) resumePlayback()
}
AudioManager.AUDIOFOCUS_LOSS -> {
pausePlayback()
wasPlayingBeforeLoss = false
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
pausePlayback()
wasPlayingBeforeLoss = true
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
duckVolume()
}
}
}
콜백에서 AUDIOFOCUS_LOSS와 AUDIOFOCUS_LOSS_TRANSIENT를 구분하는 것이 중요합니다. 첫 번째 경우 플레이어가 자동으로 재개되어서는 안 됩니다 — 사용자가 명시적으로 다른 오디오를 시작했습니다. 두 번째 경우 AUDIOFOCUS_GAIN을 수신하면 자동으로 재개할 수 있습니다. wasPlayingBeforeLoss 플래그는 재생 복원이 필요한지 기억하는 데 도움이 됩니다.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
abandonAudioFocusRequest를 호출하면 앱이 더 이상 포커스가 필요하지 않음을 시스템에 알립니다. 플레이어 일시 중지 및 중지 시 호출하는 것이 중요합니다. 포커스가 해제되지 않으면 AUDIOFOCUS_GAIN을 요청하는 다른 앱이 LOSS를 받지 못하고 소리가 겹칩니다.
포커스 손실을 올바르게 처리하는 것은 Google Play 검토를 통과하기 위한 핵심 요구 사항입니다. 잘못된 처리는 부정적인 리뷰로 이어집니다: 사용자는 전화 중이나 내비게이션 위에서 음악이 계속 재생된다고 불평합니다.
AUDIOFOCUS_LOSS를 수신하면 플레이어가 중지되고 사용자가 명시적으로 Play를 누를 때까지 재개되지 않아야 합니다. AUDIOFOCUS_LOSS_TRANSIENT(전화, 알림)의 경우 플레이어가 일시 중지되고 포커스가 복원되면 자동으로 재개됩니다. AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK의 경우 플레이어가 외부 오디오가 재생되는 동안 일시적으로 볼륨을 20–30%로 낮춥니다.
Android 개발자 가이드(2026)에 따르면 덕은 현재 AudioTrack 볼륨 레벨에 0.2–0.3의 계수를 곱하여 구현해야 합니다. AudioManager.setStreamVolume을 사용하지 마십시오 — 시스템 볼륨을 변경하여 다른 앱에 영향을 미칩니다. 덕킹은 자체 플레이어 쪽에서만 수행됩니다.
수신 전화 시 시스템이 자동으로 전화 앱을 통해 AUDIOFOCUS_GAIN_TRANSIENT를 요청합니다. 플레이어가 AUDIOFOCUS_LOSS_TRANSIENT를 수신하고 일시 중지됩니다. 전화가 끝난 후 또는 사용자가 전화를 거절하면 포커스가 반환됩니다 — 음악 플레이어인 경우 플레이어가 자동으로 재생을 재개합니다.
내비게이션 앱(Google Maps)의 경우 음성 안내 중에 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK이 사용됩니다. 플레이어 볼륨이 2–3초 동안 낮아진 후 복원됩니다. 사용자가 음악 대신 팟캐스트를 듣는 경우 덕킹보다 일시 중지가 더 좋습니다 — 팟캐스트에서는 모든 초가 중요합니다.
실제로 개발자는 Audio Focus가 다르게 동작하는 여러 표준 시나리오에 직면합니다. 일반적인 경우와 올바른 대응을 살펴보겠습니다.
포커스 손실 전에 음악이 재생 중이었는지 기억하는 플래그를 구현하는 것이 중요합니다. 사용자가 직접 일시 중지한 후 전화가 온 경우 — 재개하지 마십시오. 플래그는 사용자의 명시적 일시 중지 시 재설정되고 재생 시작 시 설정됩니다.
Google UX 연구(2024)에 따르면 전화 후 자동 재개는 사용자 만족도를 22% 증가시킵니다. 그러나 사용자가 이미 비디오 시청을 시작한 후 플레이어가 재개되면 — 불쾌감을 유발합니다. wasPlayingBeforeLoss 플래그는 잘못된 재개를 방지합니다.
자주 묻는 질문
네, Android 12부터 Google Play는 오디오를 재생하는 모든 앱에 Audio Focus 구현을 권장합니다. Music & Audio 카테고리 앱은 게시를 위해 구현해야 합니다. 무시하면 업데이트가 거부될 수 있습니다.
플레이어를 시작한 다음 다른 오디오 앱(예: YouTube Music)을 엽니다. 플레이어가 일시 중지되어야 합니다. 그런 다음 YouTube Music을 닫습니다 — 플레이어가 자동으로 재개되어야 합니다. 덕 테스트의 경우 음성 안내와 함께 Google Maps를 사용합니다.
시스템이 말합니다: “다른 앱이 잠시 짧은 소리를 재생해야 합니다 — 플레이어 볼륨을 낮추세요.” 음성 안내와 짧은 알림에 최적입니다. 외부 오디오가 끝나면 수동 개입 없이 볼륨이 복원됩니다.
공식적으로는 네 — 시스템이 강제하지 않습니다. 그러나 실제로는 소리 겹침을 의미합니다. 사용자가 음악과 전화를 동시에 듣게 되어 부정적인 경험으로 이어집니다. Google은 항상 플레이어를 중지하여 AUDIOFOCUS_LOSS를 처리할 것을 권장합니다.
iOS에서는 Audio Session이 동등한 역할을 수행하며 AVAudioSession을 통해 관리됩니다. 메커니즘은 유사합니다: 카테고리와 옵션이 소리 겹침 시 동작을 정의합니다. 그러나 API와 규칙은 크게 다릅니다 — 각 프레임워크가 고유한 방식으로 구현되어 있습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.