Audio Focus, birden fazla uygulama tarafından ses çıkışının eşzamanlı kullanımını düzenleyen bir Android mekanizmasıdır. Seslerin üst üste binmesini önler: bir uygulama oynatmayı başlattığında, sistem otomatik olarak diğerini kısar veya duraklatır. Android Developer Guide, 2026'ya göre, Audio Focus ses oynatan tüm uygulamalar için zorunludur — onsuz Google Play güncellemeyi reddedebilir.
Önemli Noktalar
Audio Focus, Android'de merkezi bir ses hakem sistemidir. Bir uygulama odak talep ettiğinde, sistem aktif bir odak “sahibi” olup olmadığını kontrol eder ve sahibine kayıp bildirimi gönderir. Sahibi, odak türüne bağlı olarak sesi kısabilir (duck), oynatmayı duraklatabilir veya yok sayabilir.
Android 8.0'den önce, odak AudioManager.requestAudioFocus(callback, stream, durationHint) aracılığıyla yönetiliyordu. Android 8.0'den itibaren, talep türünü ve otomatik odak geri yüklemeyi belirleme yeteneği ekleyen AudioFocusRequest tanıtıldı. Android 12'de mekanizma güçlendirildi — Google Play'de yayınlanmak için tüm medya oynatıcıları odağı doğru şekilde işlemelidir.
Google I/O 2024'e göre, ses uygulaması incelemelerinde kullanıcı şikayetlerinin yaklaşık %15'i ses üst üste binmesiyle ilgilidir. Doğru Audio Focus uygulaması bu sorunu çözer ve dinleme süresinde kullanıcı deneyimini %30 iyileştirir.
Audio Focus'un oynatmayı otomatik olarak kontrol etmediğini anlamak önemlidir. Sadece uygulamayı odak olayları hakkında bilgilendirir. Uygulama kendisi karar verir: oynatıcıyı duraklatmak, sesi kısmak veya oynatmaya devam etmek. Sistem zorlamaz — bu mimari karar geliştiriciye bırakılmıştır.
İstisna, navigasyon uygulamalarıdır (Google Maps, Yandex Maps). AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK odak türünü talep edebilirler, burada mevcut oynatıcının sesi kısılırken sesli yönlendirmeler üstünde çalar. Yönlendirme bittiğinde, oynatıcı otomatik olarak sesi geri yükler.
Sistem, tek bir aktif ses odağı sahibini korur. Yeni bir uygulama odak talep ettiğinde, sistem önceliği belirler ve mevcut sahibine bir olay gönderir. Mevcut sahibi olayı yok sayar ve yüksek sesle oynatmaya devam ederse, sistem herhangi bir yaptırım uygulamaz — sorumluluk tamamen oynatıcıya aittir.
Odak talebi, sisteme tahmini süreyi bildiren bir durationHint parametresi içerir: AUDIOFOCUS_GAIN (uzun oynatma — müzik, podcast), AUDIOFOCUS_GAIN_TRANSIENT (kısa süreli — bildirim sesi, navigasyon), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (mevcut oynatıcıyı kısma izni ile kısa süreli).
Odak kaybında, uygulama üç koddan birini alır: AUDIOFOCUS_LOSS (uzun süreli kayıp — başka bir uygulama müzik başlattı), AUDIOFOCUS_LOSS_TRANSIENT (geçici kayıp — arama, bildirim), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (ses kısma olasılığı ile geçici kayıp). Her kod kendi tepkisini gerektirir.
Bir kullanıcı A uygulamasında müzik dinliyor. Bir arama geliyor — B uygulaması (telefon) AUDIOFOCUS_GAIN_TRANSIENT talep ediyor. Sistem, A uygulamasına AUDIOFOCUS_LOSS_TRANSIENT gönderiyor. Oynatıcı duraklıyor. Arama bittikten sonra, B uygulaması odağı serbest bırakıyor, sistem AUDIOFOCUS_GAIN aracılığıyla A uygulamasını bilgilendiriyor — oynatıcı oynatmaya devam ediyor. Tüm zincir 50 ms'den az sürer.
Doğru durationHint'i seçmek, Audio Focus'u uygularken anahtar karardır. Yanlış tür seçimi, ses üst üste binmesine, gereksiz oynatıcı durmasına veya kullanıcı rahatsızlığına yol açar.
| Talep Türü | Senaryo | Sahibin Tepkisi |
|---|---|---|
| AUDIOFOCUS_GAIN | Müzik, podcast başlatma | AUDIOFOCUS_LOSS — oynatıcı durmalı |
| AUDIOFOCUS_GAIN_TRANSIENT | Arama, sesli bildirim | AUDIOFOCUS_LOSS_TRANSIENT — duraklat |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS yönlendirmesi, kısa sinyal | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — sesi kıs |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Sesli arama, kayıt | AUDIOFOCUS_LOSS — tam durma |
Duck, ikincil bir ses çalarken ana oynatıcının ses seviyesinin geçici olarak %20–30'a düşürülmesidir. Android, AudioManager.adjustSuggestedStreamVolume aracılığıyla manuel ducking için bir API sağlar, ancak çoğu oynatıcı ducking'i kendi yöntemleriyle uygular. Android Belgeleri'ne (2026) göre, duck işlemi 3 saniyeden fazla sürmemeli, ardından ses seviyesi geri yüklenmelidir.
Audio Focus'u doğru şekilde uygulamak için sırayla üç adımı gerçekleştirmeniz gerekir: bir talep oluşturun, oynatmadan önce odağı talep edin ve bir geri aramada olayı işleyin. AndroidX media'dan AudioFocusRequestCompat kullanımı, tüm Android sürümleriyle uyumluluğu garanti eder.
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()
}
Odak talebi, kullanıcı Play'e her bastığında oynatmayı başlatmadan önce yapılmalıdır. Sonuç AUDIOFOCUS_REQUEST_GRANTED ise — oynatmaya başlayın. DENIED ise — kullanıcıya bir mesaj gösterin veya odak elde edilene kadar oynatmayı erteleyin.
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()
}
}
}
Geri aramada, AUDIOFOCUS_LOSS ve AUDIOFOCUS_LOSS_TRANSIENT arasında ayrım yapmak önemlidir. İlk durumda, oynatıcı otomatik olarak devam etmemelidir — kullanıcı açıkça başka bir ses başlatmıştır. İkincisinde, AUDIOFOCUS_GAIN alındığında otomatik olarak devam edebilir. wasPlayingBeforeLoss bayrağı, oynatmanın geri yüklenmesi gerekip gerekmediğini hatırlamaya yardımcı olur.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
abandonAudioFocusRequest çağrısı, sisteme uygulamanın artık odağa ihtiyacı olmadığını bildirir. Bunu oynatıcıyı duraklatırken ve durdururken çağırmak önemlidir. Odak serbest bırakılmazsa, AUDIOFOCUS_GAIN talep eden başka bir uygulama LOSS almayacak ve sesler üst üste binecektir.
Odak kaybını doğru şekilde işlemek, Google Play incelemesini geçmek için önemli bir gerekliliktir. Yanlış işleme, olumsuz yorumlara yol açar: kullanıcılar, bir arama sırasında veya navigasyon üstünde müziğin çalmaya devam ettiğinden şikayet eder.
AUDIOFOCUS_LOSS alındığında, oynatıcı durmalı ve kullanıcı açıkça Play'e basana kadar devam etmemelidir. AUDIOFOCUS_LOSS_TRANSIENT'te (arama, bildirim), oynatıcı duraklar ve odak geri yüklendiğinde otomatik olarak devam eder. AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK'ta, oynatıcı harici ses çalarken geçici olarak ses seviyesini %20–30'a düşürür.
Android Geliştirici Kılavuzu'na (2026) göre, duck, mevcut AudioTrack ses seviyesini 0.2–0.3 faktörüyle çarparak uygulanmalıdır. AudioManager.setStreamVolume kullanmayın — bu sistem sesini değiştirir ve diğer uygulamaları etkiler. Ducking yalnızca kendi oynatıcı tarafında gerçekleştirilir.
Gelen bir aramada, sistem otomatik olarak Telefon uygulaması aracılığıyla AUDIOFOCUS_GAIN_TRANSIENT talep eder. Oynatıcı AUDIOFOCUS_LOSS_TRANSIENT alır ve duraklar. Arama bittikten sonra veya kullanıcı aramayı reddederse, odak geri döner — bir müzik oynatıcısıysa oynatıcı otomatik olarak oynatmaya devam eder.
Navigasyon uygulamaları (Google Maps) için, sesli yönlendirmeler sırasında AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK kullanılır. Oynatıcının sesi 2–3 saniye kısılır, ardından ses seviyesi geri yüklenir. Kullanıcı müzik yerine podcast dinliyorsa, ducking yerine duraklatmak daha iyidir — podcast'lerde her saniye önemlidir.
Pratikte, geliştiriciler Audio Focus'un farklı davrandığı birkaç standart senaryoyla karşılaşır. Tipik durumlara ve doğru tepkilere bakalım.
Odak kaybından önce müziğin çalıp çalmadığını hatırlayan bir bayrak uygulamak önemlidir. Kullanıcı kendisi duraklattıysa ve sonra bir arama geldiyse — devam etmeyin. Bayrak, kullanıcının açık duraklatmasında sıfırlanır ve oynatma başladığında ayarlanır.
Google UX araştırmasına (2024) göre, aramadan sonra otomatik devam etme, kullanıcı memnuniyetini %22 artırır. Ancak oynatıcı, kullanıcı zaten bir video izlemeye başladıktan sonra devam ederse — bu rahatsızlığa neden olur. wasPlayingBeforeLoss bayrağı yanlış devam etmeleri önler.
Sıkça Sorulan Sorular
Evet, Android 12'den itibaren Google Play, ses oynatan tüm uygulamalar için Audio Focus uygulamasını önerir. Müzik ve Ses kategorisindeki uygulamaların yayınlanmak için uygulaması zorunludur. Yok sayılması, güncellemenin reddedilmesine yol açabilir.
Oynatıcınızı başlatın, ardından başka bir ses uygulaması (örneğin YouTube Music) açın. Oynatıcınız duraklamalıdır. Ardından YouTube Music'i kapatın — oynatıcı otomatik olarak devam etmelidir. Duck testi için sesli yönlendirmelerle Google Maps'i kullanın.
Sistem şöyle der: “Başka bir uygulamanın kısa bir ses çalması gerekiyor — oynatıcınızın sesini kısın.” Bu, sesli yönlendirmeler ve kısa bildirimler için idealdir. Harici ses bittikten sonra manuel müdahale olmadan ses seviyesi geri yüklenir.
Resmi olarak evet — sistem zorlamaz. Ancak pratikte bu ses üst üste binmesi anlamına gelir. Kullanıcı aynı anda müzik ve arama duyar, bu da olumsuz bir deneyime yol açar. Google, AUDIOFOCUS_LOSS'u her zaman oynatıcıyı durdurarak işlemeyi önerir.
iOS'ta, eşdeğer rolü Audio Session üstlenir ve AVAudioSession aracılığıyla yönetilir. Mekanizmalar benzerdir: kategoriler ve seçenekler, ses üst üste binmesi sırasında davranışı tanımlar. Ancak, API ve kurallar önemli ölçüde farklılık gösterir — her çerçeve kendi yolunda uygulanmıştır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun