Audio Focus — mechanizm Androida, który reguluje jednoczesne korzystanie z wyjścia audio przez kilka aplikacji. Zapobiega nakładaniu się dźwięków: gdy jedna aplikacja rozpoczyna odtwarzanie, system automatycznie wycisza lub wstrzymuje inną. Według Android Developer Guide, 2026, Audio Focus jest obowiązkowy dla wszystkich aplikacji odtwarzających audio — bez niego Google Play może odrzucić aktualizację.
Najważniejsze
Audio Focus — to scentralizowany system arbitrażu audio w Androidzie. Gdy jedna aplikacja żąda fokusu, system sprawdza, czy istnieje aktywny „właściciel” fokusu i wysyła mu powiadomienie o utracie. Właściciel może albo ściszyć dźwięk (duck), albo wstrzymać odtwarzanie, albo zignorować — w zależności od typu fokusu.
Przed Androidem 8.0 fokus był zarządzany przez AudioManager.requestAudioFocus(callback, stream, durationHint). Od Androida 8.0 pojawił się AudioFocusRequest, który dodał możliwość określania typu żądania i automatycznego przywracania fokusu. W Androidzie 12 mechanizm został wzmocniony — wszystkie odtwarzacze multimedialne muszą poprawnie obsługiwać fokus, aby opublikować aplikację w Google Play.
Według Google I/O 2024, około 15% skarg użytkowników w recenzjach aplikacji audio dotyczy nakładania się dźwięków. Prawidłowa implementacja Audio Focus rozwiązuje ten problem i poprawia doświadczenie użytkownika o 30% pod względem czasu słuchania.
Ważne jest, aby zrozumieć, że Audio Focus nie zarządza odtwarzaniem automatycznie. Tylko powiadamia aplikację o zdarzeniach fokusu. Aplikacja sama decyduje: wstrzymać odtwarzacz, obniżyć głośność lub kontynuować granie. System nie wymusza — to decyzja architektoniczna pozostawiona uznaniu programisty.
Wyjątkiem są aplikacje nawigacyjne (Google Maps, Yandex.Maps). Mogą one zażądać fokusu typu AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, przy którym istniejący odtwarzacz jest ściszany, a wskazówki głosowe brzmią na wierzchu. Po zakończeniu wskazówki odtwarzacz automatycznie przywraca głośność.
System utrzymuje jednego aktywnego właściciela fokusu audio. Przy żądaniu fokusu przez nową aplikację system określa priorytet i wysyła zdarzenie do bieżącego właściciela. Jeśli bieżący właściciel ignoruje zdarzenie i nadal gra głośno, system nie stosuje sankcji — odpowiedzialność spoczywa w pełni na odtwarzaczu.
Żądanie fokusu zawiera parametr durationHint, który informuje system o przewidywanym czasie trwania: AUDIOFOCUS_GAIN (długotrwałe odtwarzanie — muzyka, podcast), AUDIOFOCUS_GAIN_TRANSIENT (krótkotrwałe — dźwięk powiadomienia, nawigacja), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (krótkotrwałe z zezwoleniem na ściszenie istniejącego odtwarzacza).
Przy utracie fokusu aplikacja otrzymuje jeden z trzech kodów: AUDIOFOCUS_LOSS (długotrwała utrata — inna aplikacja uruchomiła muzykę), AUDIOFOCUS_LOSS_TRANSIENT (tymczasowa utrata — połączenie, powiadomienie), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (tymczasowa utrata z możliwością ściszenia). Każdy kod wymaga własnej reakcji.
Użytkownik słucha muzyki w aplikacji A. Przychodzi połączenie — aplikacja B (telefon) żąda AUDIOFOCUS_GAIN_TRANSIENT. System wysyła AUDIOFOCUS_LOSS_TRANSIENT do aplikacji A. Odtwarzacz wstrzymuje się. Po zakończeniu połączenia aplikacja B zwalnia fokus, system powiadamia aplikację A przez AUDIOFOCUS_GAIN — odtwarzacz wznawia odtwarzanie. Cały łańcuch zajmuje mniej niż 50 ms.
Prawidłowy wybór durationHint — kluczowa decyzja przy implementacji Audio Focus. Błąd w wyborze typu prowadzi albo do nakładania się dźwięków, albo do nieuzasadnionego zatrzymania odtwarzacza, albo do irytacji użytkownika.
| Typ żądania | Scenariusz | Reakcja właściciela |
|---|---|---|
| AUDIOFOCUS_GAIN | Uruchomienie muzyki, podcastu | AUDIOFOCUS_LOSS — odtwarzacz powinien się zatrzymać |
| AUDIOFOCUS_GAIN_TRANSIENT | Połączenie, powiadomienie głosowe | AUDIOFOCUS_LOSS_TRANSIENT — pauza |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | Wskazówka GPS, krótki sygnał | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — ściszenie |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Wyszukiwanie głosowe, nagrywanie | AUDIOFOCUS_LOSS — całkowite zatrzymanie |
Duck — to tymczasowe obniżenie głośności głównego odtwarzacza do 20–30% na czas trwania dźwięku drugorzędnego. Android udostępnia API do ręcznego duck przez AudioManager.adjustSuggestedStreamVolume, ale większość odtwarzaczy implementuje ściszenie własnymi środkami. Według Android Documentation (2026), obsługa duck powinna trwać nie dłużej niż 3 sekundy, po czym głośność jest przywracana.
Do prawidłowej implementacji Audio Focus należy kolejno wykonać trzy kroki: utworzyć żądanie, zażądać fokusu przed odtwarzaniem i obsłużyć zdarzenie w callbacku. Użycie AudioFocusRequestCompat z AndroidX media zapewnia kompatybilność ze wszystkimi wersjami Androida.
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()
}
Żądanie fokusu powinno być wykonane przed rozpoczęciem odtwarzania za każdym razem, gdy użytkownik naciska Play. Jeśli wynik to AUDIOFOCUS_REQUEST_GRANTED — rozpocznij odtwarzanie. Jeśli DENIED — pokaż użytkownikowi komunikat lub odłóż odtwarzanie do momentu uzyskania fokusu.
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()
}
}
}
W callbacku ważne jest rozróżnienie AUDIOFOCUS_LOSS i AUDIOFOCUS_LOSS_TRANSIENT. W pierwszym przypadku odtwarzacz NIE powinien wznawiać automatycznie — użytkownik jawnie uruchomił inne audio. W drugim — można automatycznie wznowić po otrzymaniu AUDIOFOCUS_GAIN. Flaga wasPlayingBeforeLoss pomaga zapamiętać, czy należy przywrócić odtwarzanie.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Wywołanie abandonAudioFocusRequest informuje system, że aplikacja nie potrzebuje już fokusu. Należy je wywoływać przy pauzie i zatrzymaniu odtwarzacza. Jeśli nie zwolnisz fokusu, inna aplikacja żądająca AUDIOFOCUS_GAIN nie otrzyma LOSS i dźwięki będą się nakładać.
Poprawna obsługa utraty fokusu — kluczowy wymóg do przejścia recenzji w Google Play. Nieprawidłowa obsługa prowadzi do negatywnych opinii: użytkownicy skarżą się, że muzyka nadal gra podczas połączenia lub na tle nawigacji.
Po otrzymaniu AUDIOFOCUS_LOSS odtwarzacz powinien się zatrzymać i nie wznawiać do momentu jawnego naciśnięcia Play. Przy AUDIOFOCUS_LOSS_TRANSIENT (połączenie, powiadomienie) odtwarzacz wstrzymuje się i wznawia automatycznie po przywróceniu fokusu. Przy AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK odtwarzacz tymczasowo obniża głośność do 20–30% na czas trwania zewnętrznego audio.
Według Android Developer Guide (2026), duck powinien być zaimplementowany przez pomnożenie bieżącego poziomu głośności AudioTrack przez współczynnik 0.2–0.3. Nie używaj AudioManager.setStreamVolume — to zmienia systemową głośność i wpływa na inne aplikacje. Duck wykonuje się tylko po stronie własnego odtwarzacza.
Przy połączeniu przychodzącym system automatycznie żąda AUDIOFOCUS_GAIN_TRANSIENT przez aplikację Telefon. Odtwarzacz otrzymuje AUDIOFOCUS_LOSS_TRANSIENT i wstrzymuje się. Po zakończeniu połączenia lub jeśli użytkownik odrzucił połączenie, fokus wraca — odtwarzacz automatycznie wznawia odtwarzanie, jeśli to odtwarzacz muzyczny.
Dla aplikacji nawigacyjnych (Google Maps) używany jest AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK przy wskazówkach głosowych. Odtwarzacz jest ściszany na 2–3 sekundy, następnie głośność jest przywracana. Jeśli użytkownik słucha podcastu, a nie muzyki, zamiast duck lepiej wstrzymać — w podcastach każda sekunda jest ważna.
W praktyce programiści spotykają się z kilkoma standardowymi scenariuszami, w których Audio Focus zachowuje się różnie. Rozważmy typowe przypadki i prawidłowe reakcje na nie.
Ważne jest zaimplementowanie flagi, która zapamiętuje, czy muzyka grała przed utratą fokusu. Jeśli użytkownik sam nacisnął pauzę, a potem przyszło połączenie — nie należy wznawiać. Flaga jest resetowana przy jawnej pauzie użytkownika i ustawiana przy starcie odtwarzania.
Według badań UX Google (2024), automatyczne wznawianie po połączeniu zwiększa zadowolenie użytkowników o 22%. Ale jeśli odtwarzacz wznowił po tym, jak użytkownik już zaczął oglądać wideo — to powoduje irytację. Flaga wasPlayingBeforeLoss chroni przed fałszywymi wznowieniami.
Często zadawane pytania
Tak, począwszy od Androida 12, Google Play zaleca implementację Audio Focus dla wszystkich aplikacji odtwarzających audio. Aplikacje kategorii Music & Audio są zobowiązane do jego implementacji w celu publikacji. Ignorowanie może prowadzić do odrzucenia aktualizacji.
Uruchom odtwarzacz, następnie otwórz inną aplikację z audio (na przykład YouTube Music). Twój odtwarzacz powinien się wstrzymać. Następnie zamknij YouTube Music — odtwarzacz powinien automatycznie wznowić. Do testu duck użyj Google Maps ze wskazówkami głosowymi.
System informuje: „Inna aplikacja musi na krótko odtworzyć krótki dźwięk — ścisz swój odtwarzacz”. Jest to optymalne dla wskazówek głosowych i krótkich powiadomień. Głośność jest przywracana po zakończeniu obcego audio bez ręcznej interwencji.
Formalnie tak — system nie wymusza. Ale w praktyce oznacza to nakładanie się dźwięków. Użytkownik usłyszy jednocześnie muzykę i połączenie, co prowadzi do negatywnego doświadczenia. Google zaleca zawsze obsługiwać AUDIOFOCUS_LOSS zatrzymaniem odtwarzacza.
Na iOS analogiczną rolę pełni Audio Session, zarządzana przez AVAudioSession. Mechanizmy są podobne: kategorie i opcje określają zachowanie przy nakładaniu się dźwięków. Jednak API i zasady radykalnie się różnią — każdy framework jest zaimplementowany inaczej.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również