Audio Focus — Android mexanizmidir, bir neçə tətbiq tərəfindən audio çıxışının eyni vaxtda istifadəsini tənzimləyir. Səslərin üst-üstə düşməsinin qarşısını alır: bir tətbiq oxutmağa başlayanda sistem avtomatik olaraq digərini səssizləşdirir və ya dayandırır. Android Developer Guide, 2026-ya görə, Audio Focus audio oxudan bütün tətbiqlər üçün məcburidir — onsuz Google Play yeniləməni rədd edə bilər.
Əsas məqamlar
Audio Focus — Android-də mərkəzləşdirilmiş audio arbitraj sistemidir. Bir tətbiq fokus tələb etdikdə, sistem aktiv fokus «sahibinin» olub-olmadığını yoxlayır və ona itki barədə bildiriş göndərir. Sahib fokusun növündən asılı olaraq səsi zəiflədə (duck), oxutmanı dayandıra və ya görməməzlikdən gələ bilər.
Android 8.0-dan əvvəl fokus AudioManager.requestAudioFocus(callback, stream, durationHint) vasitəsilə idarə olunurdu. Android 8.0-dan başlayaraq AudioFocusRequest meydana gəldi ki, bu da sorğu növünü və fokusun avtomatik bərpasını göstərməyə imkan verdi. Android 12-də mexanizm gücləndirildi — bütün media oxuducuları Google Play-də dərc olunmaq üçün fokusu düzgün idarə etməlidirlər.
Google I/O 2024 məlumatına görə, audio tətbiqlərin rəylərində istifadəçi şikayətlərinin təxminən 15%-i səslərin üst-üstə düşməsi ilə bağlıdır. Audio Focus-un düzgün tətbiqi bu problemi həll edir və istifadəçi təcrübəsini dinləmə müddətinə görə 30% yaxşılaşdırır.
Anlamaq vacibdir ki, Audio Focus oxutmanı avtomatik idarə etmir. O, yalnız tətbiqə fokus hadisələri barədə məlumat verir. Tətbiq özü qərar verir: oxuducunu dayandırmaq, səsi azaltmaq və ya davam etdirmək. Sistem məcbur etmir — bu, memarlıq qərarı olaraq tərtibatçının ixtiyarına buraxılıb.
İstisna naviqasiya tətbiqləridir (Google Maps, Yandex.Maps). Onlar AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK tipli fokus tələb edə bilərlər ki, bununla da mövcud oxuducu səssizləşir və səsli göstərişlər üstündə səslənir. Göstəriş bitdikdən sonra oxuducu avtomatik olaraq səsi bərpa edir.
Sistem yalnız bir aktiv audio fokus sahibini saxlayır. Yeni tətbiq fokus tələb etdikdə, sistem prioriteti müəyyənləşdirir və cari sahibə hadisə göndərir. Əgər cari sahib hadisəni görməməzliyə vurub yüksək səslə oxutmağa davam edərsə, sistem sanksiya tətbiq etmir — məsuliyyət tamamilə oxuducunun üzərindədir.
Fokus tələbi durationHint parametrini ehtiva edir ki, bu da sistemə gözlənilən müddət barədə məlumat verir: AUDIOFOCUS_GAIN (uzunmüddətli oxutma — musiqi, podkast), AUDIOFOCUS_GAIN_TRANSIENT (qısamüddətli — bildiriş səsi, naviqasiya), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (mövcud oxuducunu səssizləşdirməyə icazə ilə qısamüddətli).
Fokus itkisində tətbiq üç koddan birini alır: AUDIOFOCUS_LOSS (uzunmüddətli itki — başqa tətbiq musiqi işə saldı), AUDIOFOCUS_LOSS_TRANSIENT (müvəqqəti itki — zəng, bildiriş), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (səssizləşdirmə imkanı ilə müvəqqəti itki). Hər bir kod öz reaksiyasını tələb edir.
İstifadəçi A tətbiqində musiqi dinləyir. Zəng gəlir — B tətbiqi (telefon) AUDIOFOCUS_GAIN_TRANSIENT tələb edir. Sistem A tətbiqinə AUDIOFOCUS_LOSS_TRANSIENT göndərir. Oxuducu dayanır. Zəng bitdikdən sonra B tətbiqi fokusu azad edir, sistem A tətbiqinə AUDIOFOCUS_GAIN vasitəsilə məlumat verir — oxuducu oxutmanı bərpa edir. Bütün zəncir 50 ms-dən az çəkir.
Düzgün durationHint seçimi — Audio Focus-un tətbiqində əsas qərardır. Növ seçimində səhv ya səslərin üst-üstə düşməsinə, ya əsassız oxuducu dayanmasına, ya da istifadəçinin narazılığına səbəb olur.
| Sorğu növü | Ssenari | Sahibin reaksiyası |
|---|---|---|
| AUDIOFOCUS_GAIN | Musiqi, podkast işə salma | AUDIOFOCUS_LOSS — oxuducu dayanmalıdır |
| AUDIOFOCUS_GAIN_TRANSIENT | Zəng, səsli bildiriş | AUDIOFOCUS_LOSS_TRANSIENT — fasilə |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS göstərişi, qısa siqnal | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — səssizləşdirmə |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Səsli axtarış, yazı | AUDIOFOCUS_LOSS — tam dayanma |
Duck — ikinci dərəcəli səsin səslənməsi müddətində əsas oxuducunun səsinin 20–30%-ə qədər müvəqqəti azaldılmasıdır. Android əl ilə duck üçün AudioManager.adjustSuggestedStreamVolume vasitəsilə API təqdim edir, lakin əksər oxuducular səssizləşdirməni öz vasitələri ilə həyata keçirir. Android Documentation (2026)-ya görə, duck işləməsi 3 saniyədən çox olmamalıdır, sonra səs bərpa edilir.
Audio Focus-un düzgün tətbiqi üçün ardıcıl olaraq üç addımı yerinə yetirmək lazımdır: sorğu yaratmaq, oxutmaqdan əvvəl fokus tələb etmək və callback-də hadisəni idarə etmək. AndroidX media-dan AudioFocusRequestCompat istifadəsi Android-in bütün versiyaları ilə uyğunluğu təmin edir.
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()
}
Fokus sorğusu hər dəfə istifadəçi Play düyməsini basdıqda oxutma başlamazdan əvvəl yerinə yetirilməlidir. Nəticə AUDIOFOCUS_REQUEST_GRANTED olarsa — oxutmağa başlayın. DENIED olarsa — istifadəçiyə mesaj göstərin və ya fokus əldə olunana qədər oxutmanı təxirə salın.
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()
}
}
}
Callback-də AUDIOFOCUS_LOSS və AUDIOFOCUS_LOSS_TRANSIENT-i fərqləndirmək vacibdir. Birinci halda oxuducu avtomatik bərpa edilməməlidir — istifadəçi açıq şəkildə başqa audio işə salıb. İkincidə — AUDIOFOCUS_GAIN aldıqda avtomatik bərpa edilə bilər. wasPlayingBeforeLoss bayrağı oxutmanı bərpa etmək lazım olub-olmadığını yadda saxlamağa kömək edir.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
abandonAudioFocusRequest çağırışı sistemə tətbiqin fokusa ehtiyacının olmadığını bildirir. Bunu fasilə və oxuducunun dayandırılması zamanı çağırmaq vacibdir. Fokus azad edilməzsə, AUDIOFOCUS_GAIN tələb edən başqa tətbiq LOSS almayacaq və səslər üst-üstə düşəcək.
Fokus itkisinin düzgün idarəsi — Google Play-də baxışdan keçmək üçün əsas tələbdir. Yanlış idarə mənfi rəylərə gətirib çıxarır: istifadəçilər musiqinin zəng zamanı və ya naviqasiya fonunda səslənməyə davam etməsindən şikayətlənir.
AUDIOFOCUS_LOSS aldıqda oxuducu dayanmalı və açıq şəkildə Play düyməsi basılana qədər bərpa edilməməlidir. AUDIOFOCUS_LOSS_TRANSIENT (zəng, bildiriş) zamanı oxuducu dayanır və fokus bərpa edildikdə avtomatik bərpa olunur. AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK zamanı oxuducu xarici audio səslənməsi müddətində səsi müvəqqəti olaraq 20–30%-ə qədər azaldır.
Android Developer Guide (2026)-ya görə, duck AudioTrack-in cari səs səviyyəsini 0.2–0.3 əmsalına vurmaqla tətbiq edilməlidir. AudioManager.setStreamVolume istifadə etməyin — bu sistem səsini dəyişir və digər tətbiqlərə təsir edir. Duck yalnız öz oxuducunuz tərəfindən yerinə yetirilir.
Daxil olan zəng zamanı sistem avtomatik olaraq Telefon tətbiqi vasitəsilə AUDIOFOCUS_GAIN_TRANSIENT tələb edir. Oxuducu AUDIOFOCUS_LOSS_TRANSIENT alır və dayanır. Zəng bitdikdən və ya istifadəçi zəngi rədd etdikdən sonra fokus qayıdır — oxuducu avtomatik oxutmanı bərpa edir, əgər bu musiqi oxuducusudursa.
Naviqasiya tətbiqləri (Google Maps) üçün səsli göstərişlər zamanı AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK istifadə olunur. Oxuducu 2–3 saniyə səssizləşir, sonra səs bərpa olunur. Əgər istifadəçi musiqi deyil, podkast dinləyirsə, duck əvəzinə fasilə vermək daha yaxşıdır — podkastlarda hər saniyə vacibdir.
Praktikada tərtibatçılar Audio Focus-un müxtəlif davrandığı bir neçə standart ssenari ilə qarşılaşırlar. Tipik halları və onlara düzgün reaksiyaları nəzərdən keçirək.
Fokus itkisindən əvvəl musiqinin oxuyub-oxumadığını yadda saxlayan bayrağı tətbiq etmək vacibdir. Əgər istifadəçi özü fasilə veribsə, sonra zəng gəlibsə — bərpa etmək lazım deyil. Bayraq istifadəçinin açıq fasiləsində sıfırlanır və oxutma başlanğıcında qurulur.
Google UX tədqiqatlarına (2024) görə, zəngdən sonra avtomatik bərpa istifadəçi məmnuniyyətini 22% artırır. Lakin oxuducu istifadəçi artıq video izləməyə başladıqdan sonra bərpa olunarsa — bu qıcıq yaradır. wasPlayingBeforeLoss bayrağı yalan bərpalardan qoruyur.
Tez-tez verilən suallar
Bəli, Android 12-dən başlayaraq, Google Play audio oxudan bütün tətbiqlər üçün Audio Focus tətbiqini tövsiyə edir. Music & Audio kateqoriyasındakı tətbiqlər dərc olunmaq üçün onu tətbiq etməlidirlər. Görməməzlik yeniləmənin rədd edilməsinə səbəb ola bilər.
Oxuducunu işə salın, sonra audio ilə başqa tətbiq açın (məsələn, YouTube Music). Oxuducunuz dayanmalıdır. Sonra YouTube Music-i bağlayın — oxuducu avtomatik bərpa olunmalıdır. Duck testi üçün Google Maps-dən səsli göstərişlərlə istifadə edin.
Sistem bildirir: «Başqa tətbiq qısa səsi səsləndirməlidir — oxuducunu səssizləşdir». Bu, səsli göstərişlər və qısa bildirişlər üçün optimaldır. Xarici audio bitdikdən sonra səs əl müdaxiləsi olmadan bərpa olunur.
Formal olaraq bəli — sistem məcbur etmir. Lakin praktikada bu səslərin üst-üstə düşməsi deməkdir. İstifadəçi eyni anda musiqi və zəng eşidəcək ki, bu da mənfi təcrübəyə gətirib çıxarır. Google AUDIOFOCUS_LOSS-un oxuducunu dayandırmaqla idarə edilməsini tövsiyə edir.
iOS-da analoji rolu AVAudioSession vasitəsilə idarə olunan Audio Session oynayır. Mexanizmlər oxşardır: kateqoriyalar və seçimlər səslərin üst-üstə düşməsi zamanı davranışı müəyyən edir. Lakin API və qaydalar köklü şəkildə fərqlənir — hər bir freymvork özünəməxsus şəkildə tətbiq olunub.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun