Audio Focus: istota pojęcia, tryby i zarządzanie w Androidzie

Autor: IT Sectr Opublikowano: 2026-05-23 Czas czytania: 8 min

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 — systemowy mechanizm Androida do koordynacji odtwarzania audio między aplikacjami bez nakładania się dźwięków.
  • Żądanie fokusu wykonuje się przez AudioManager.requestAudioFocus() z określeniem typu i czasu trwania odtwarzania.
  • System powiadamia o zmianie fokusu przez AudioManager.OnAudioFocusChangeListener z kodami AUDIOFOCUS_GAIN, LOSS i DUCK.
  • Auto Resume — po otrzymaniu AUDIOFOCUS_LOSS aplikacja powinna wstrzymać odtwarzanie i wznowić po AUDIOFOCUS_GAIN.
  • Android 12+ wymaga obowiązkowego korzystania z AudioFocusRequestCompat z AndroidX do tworzenia żądania fokusu.

Co to jest Audio Focus?

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.

Audio Focus a odtwarzanie multimediów

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ść.

Jak działa Audio Focus w Androidzie

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.

Łańcuch zdarzeń Audio Focus

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.

Typy i tryby żądania Audio Focus

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 żądaniaScenariuszReakcja właściciela
AUDIOFOCUS_GAINUruchomienie muzyki, podcastuAUDIOFOCUS_LOSS — odtwarzacz powinien się zatrzymać
AUDIOFOCUS_GAIN_TRANSIENTPołączenie, powiadomienie głosoweAUDIOFOCUS_LOSS_TRANSIENT — pauza
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKWskazówka GPS, krótki sygnałAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — ściszenie
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVEWyszukiwanie głosowe, nagrywanieAUDIOFOCUS_LOSS — całkowite zatrzymanie

Cechy szczególne AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

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.

Implementacja Audio Focus w kodzie

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.

Tworzenie i wykonanie żądania Audio Focus

kotlin
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.

Callback obsługi zmiany fokusu

kotlin
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.

Zwalnianie Audio Focus

kotlin
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ć.

Obsługa utraty audiofokusu

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.

Obsługa połączeń i nawigacji

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.

Typowe scenariusze użycia

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.

  • Muzyka + połączenie — odtwarzacz wstrzymuje się (AUDIOFOCUS_LOSS_TRANSIENT). Po połączeniu automatycznie wznawia, jeśli użytkownik nie wykonywał działań w odtwarzaczu.
  • Muzyka + nawigacja — odtwarzacz jest ściszany na czas wskazówki głosowej (DUCK). Głośność jest przywracana po zakończeniu frazy.
  • Użytkownik uruchomił inną aplikację — odtwarzacz otrzymuje AUDIOFOCUS_LOSS i zatrzymuje się. Wznowienie tylko po naciśnięciu przycisku Play.
  • Wideo + muzyka w tle — odtwarzacz wideo żąda AUDIOFOCUS_GAIN. Odtwarzacz muzyczny otrzymuje LOSS i zatrzymuje się.
  • Wyszukiwanie głosowe (Google Assistant) — aplikacja otrzymuje AUDIOFOCUS_LOSS_TRANSIENT, wstrzymuje się i automatycznie wznawia po odpowiedzi asystenta.

Automatyczne wznawianie po utracie fokusu

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

Czy Audio Focus jest obowiązkowy dla wszystkich aplikacji z audio?

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.

Jak sprawdzić, że Audio Focus działa poprawnie?

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.

Czym jest AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK w praktyce?

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.

Czy można odrzucić żądanie utraty Audio Focus?

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.

Czy Audio Focus działa na innych platformach poza Androidem?

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

  • Audio Focus — systemowy arbiter audio w Androidzie, zapobiegający nakładaniu się dźwięków z różnych aplikacji.
  • Żądanie fokusu wykonuje się przez AudioFocusRequestCompat z określeniem durationHint: GAIN, TRANSIENT lub TRANSIENT_MAY_DUCK.
  • Callback OnAudioFocusChangeListener obsługuje cztery zdarzenia: GAIN, LOSS, LOSS_TRANSIENT i LOSS_TRANSIENT_CAN_DUCK.
  • Przy AUDIOFOCUS_LOSS odtwarzacz zatrzymuje się, przy TRANSIENT — wstrzymuje z automatycznym wznawianiem, przy DUCK — jest ściszany.
  • Ważne jest zapamiętanie flagi wasPlayingBeforeLoss, aby nie wznawiać odtwarzania po jawnej pauzie użytkownika.
  • Zwalnianie fokusu przez abandonAudioFocusRequest jest obowiązkowe przy pauzie i zatrzymaniu odtwarzacza.
  • Na iOS odpowiednikiem Audio Focus jest Audio Session (AVAudioSession) z własnymi kategoriami i trybami.

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.

Omów projekt

Przeczytaj również