Bir uygulama, mantıksal akışı başlatmadan önce mantıksal akış için kullanılan ses özelliklerini kullanarak ses odağını ister. Uygulama, otomotiv kullanım alanlarında beklendiği gibi performans göstermek için odaklanma kaybına dikkat etmelidir.
Odak isteği göndermek önerilir ancak sistem tarafından zorunlu kılınmaz. Bu nedenle, odağı birincil ses kontrol mekanizması yerine oynatma sırasındaki çakışmaları dolaylı olarak kontrol etmek ve önlemek için kullanın. Araç, ses alt sisteminin çalışması için odak sistemine bağlı olmamalıdır.
Odak etkileşimleri
AAOS'u desteklemek için ses odak istekleri, istek CarAudioContext
ile mevcut odak sahiplerinin CarAudioContext
arasında önceden tanımlanmış etkileşimlere göre işlenir. Üç tür etkileşim vardır:
- Özel
- Reddet
- Eşzamanlı
Özel etkileşim
Bu, Android ile en sık kullanılan etkileşim modelidir.
Özel etkileşimlerde, aynı anda yalnızca bir uygulamanın odakta kalmasına izin verilir.
Bu nedenle, gelen bir odak isteğine odak verilirken mevcut odak sahibi odağını kaybeder. Her iki uygulama da medya oynattığından yalnızca bir uygulamanın odakta kalmasına izin verilir. Sonuç olarak, yeni başlatılan uygulamanın odak isteği AUDIOFOCUS_REQUEST_GRANTED
ile döndürülürken, şu anda müzik çalan uygulama, yapılan istek türüne karşılık gelen bir kayıp durumu içeren bir odak değişikliği etkinliği alır.
Etkileşimi reddetme
Reddet etkileşimlerinde gelen istek her zaman reddedilir. Örneğin, arama devam ederken müzik çalmaya çalışırken. Bu durumda, Arama uygulaması bir arama için ses odağını elinde tutuyorsa ve ikinci bir uygulama müzik çalmak için odak isterse müzik uygulaması, isteğe yanıt olarak AUDIOFOCUS_REQUEST_FAILED
alır. Odak isteği reddedildiği için mevcut odak sahibine odak kaybı gönderilmez.
Eşzamanlı etkileşim
AAOS'a özgü olan eşzamanlı etkileşimlerdir. Bu sayede, araçta ses odak isteğinde bulunan uygulamalar diğer uygulamalarla aynı anda odak tutabilir. Eşzamanlı etkileşimin gerçekleşmesi için aşağıdaki koşulların karşılanması gerekir. Aşağıdakiler:
Gelen odak isteği AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK istemelidir
Mevcut odak tutucusu setPauseWhenDucked(true) değerini ayarlamaz.
Mevcut odak sahibi, ses kısma etkinliklerini almamayı tercih eder.
Bu ölçütler karşılanırsa odak isteği AUDIOFOCUS_REQUEST_GRANTED
ile döndürülür. Mevcut odak sahibinin odağında ise herhangi bir değişiklik olmaz. Ancak, mevcut odak sahibi, gizleme etkinlikleri almayı veya gizlendiğinde duraklatmayı seçerse mevcut odak sahibi, özel etkileşimde olduğu gibi odağı kaybeder.
Eşzamanlı akışları yönetme
Eşzamanlı etkileşimin birçok kullanımı olsa da çıkış cihazları arasında donanım düzeyinde karıştırma ve ses azaltma işlemlerinde dikkatli olun. Eşzamanlı olarak oynatılmasına izin verilen CarAudioContext
'lerin farklı çıkış cihazlarına yönlendirilmesini önemle tavsiye ederiz.
Eşzamanlı yayınlar için ayrı çıkış cihazları olması, HAL'ın yayınları karıştırmadan önce bunlardan birini susturmasına veya fiziksel yayınları araçtaki farklı hoparlörlere yönlendirmesine olanak tanır. Mantıksal akışlar Android'de karıştırılırsa kazançlar değiştirilmez ve aynı fiziksel akış kapsamında yayınlanır.
Örneğin, gezinme ve medya aynı anda yayınlanırken gezinme talimatlarının daha net duyulması için medya akışının kazancı geçici olarak azaltılabilir (veya azaltılabilir). Alternatif olarak, navigasyon akışı sürücü tarafı hoparlörlere yönlendirilebilir. Bu sırada medya, kabinin geri kalanında çalmaya devam eder.
Etkileşim matrisi
Aşağıdaki tabloda, CarAudioService
tarafından tanımlanan etkileşim matrisi gösterilmektedir.
Her satır, mevcut odak sahibinin CarAudioContext
değerini, her sütun ise gelen isteğin CarAudioContext
değerini temsil eder.
Örneğin, bir müzik medya uygulaması, navigasyon uygulaması odaklanmayı istediğinde odaklanmayı koruduğunda matris, eşzamanlı etkileşimler ile ilgili diğer ölçütlerin karşılandığı varsayılarak iki etkileşimin eşzamanlı olarak oynatılabileceğini gösterir.
Eşzamanlı etkileşimler nedeniyle birden fazla odak noktası olabilir. Bu durumda, hangi etkileşimin uygulanacağı belirlenmeden önce gelen bir odak isteği, mevcut odak sahiplerinin her biri ile karşılaştırılır. Bu durumda en muhafazakar etkileşim kazanır. Reddetme, ardından özel ve son olarak eşzamanlı.
Şekil 1. Ses odağı etkileşim matrisi.
Telefon görüşmeleri sırasında navigasyon
Android 11'de, kullanıcıların navigasyon ile telefon görüşmeleri arasındaki etkileşim davranışını değiştirmesine olanak tanıyan yeni bir kullanıcı ayarı kullanıma sunuldu. Ayarlandığında android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL
, gelen NAVIGATION
odak istekleriyle mevcut CALL
odak tutucular arasındaki etkileşimi eşzamanlı yerine reddeder olarak değiştirir. Bir kullanıcı, navigasyon talimatlarının aramayı kesintiye uğratmamasını tercih ederse bu ayarı etkinleştirebilir. Bu değer kullanıcı için kalıcı olur ve sonraki odaklanma isteklerinin yeni ayara uyması için dinamik olarak ayarlanabilir.
Ertelenebilen ses odağı
Android 11'de AAOS, ertelenebilir ses odağını isteme desteği ekledi. Bu sayede, geçici olmayan odak isteklerinin, mevcut odak sahipleriyle etkileşimi normalde reddedilmeleriyle sonuçlandığında geciktirilmesi sağlanır. Odaktaki bir değişiklik, gecikmeli isteğin odak alabileceği bir duruma yol açtığında istek kabul edilir.
Gecikmeli ses odak istekleri için kurallar
Yalnızca geçici olmayan istekler. Geçici seslerin, alakalı olduktan çok sonra çalınmasını önlemek için gecikmeli istek yalnızca geçici olmayan kaynaklar için gönderilebilir.
Tek seferde yalnızca bir istek ertelenebilir. Geciktirilebilir bir istek, gecikmeli bir istek varken yapılırsa orijinal gecikmeli istek bir
AUDIOFOCUS_LOSS
değişiklik etkinliği alır ve yeni istekAUDIOFOCUS_REQUEST_DELAYED
eşzamanlı yanıtı alır.Ertelenebilen isteklerin bir
OnAudioFocusChangeListener
değeri olmalıdır Bir istek ertelendiğinde, istek sonunda onaylandığında (AUDIOFOCUS_GAIN
) veya daha sonra reddedildiğinde (AUDIOFOCUS_LOSS
) istek sahibini bilgilendirmek için dinleyici kullanılır.
Ertelenebilen odaklanma isteğinde bulunma
Ertelenebilecek bir istek oluşturmak için:
AudioFocusRequest.Builder#setAcceptsDelayedFocusGain
hesabını kullan.mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener(); mDelayedFocusRequest = new AudioFocusRequest .Builder(AudioManager.AUDIOFOCUS_GAIN) .setAudioAttributes(mMusicAudioAttrib) .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener) .setForceDucking(false) .setWillPauseWhenDucked(false) .setAcceptsDelayedFocusGain(true) .build();
İsteği gönderirken
AUDIOFOCUS_REQUEST_DELAYED
yanıtını ele alın:int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest); if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // start audio playback return; } if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) { // audio playback delayed to audio focus listener return; }
İstek gecikirse odağı dinleyen, odaktaki değişiklikleri işler:
private final class MediaWithDelayedFocusListener implements OnAudioFocusChangeListener { @Override public void onAudioFocusChange(int focusChange) { synchronized (mLock) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: … // Start focus playback case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: … // Pause media transiently case AudioManager.AUDIOFOCUS_LOSS: … // Stop media
Çoklu bölgeli odak yönetimi
Birden fazla ses bölgesi olan araçlarda ses odak noktası her bölge için ayrı ayrı yönetilir. Bu nedenle, bir alt bölgeye gönderilen istek, diğer alt bölgelerde hangi öğenin odakta olduğunu dikkate almaz ve diğer alt bölgelerdeki odak tutucuların odağını kaybetmesine neden olmaz. Bu sayede, ana kabinin odağı arka koltuk eğlence sisteminden ayrı olarak yönetilebilir. Böylece, odakta yapılan değişiklikler nedeniyle bir bölgedeki ses oynatımı kesintiye uğramaz.
CarAudioService
, tüm uygulamalarda odağı otomatik olarak yönetir. Odak isteğinin ses bölgesi, ilişkili UserId
veya UID
tarafından belirlenir (ayrıntılar için Çok bölgeli ses yönlendirmesi bölümüne bakın).
Eşzamanlı olarak birden fazla bölgeden ses isteğinde bulunma
Bir uygulama birden fazla bölgede aynı anda ses çalmak istiyorsa pakete AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
ekleyerek her bölge için odaklanmayı istemelidir:
//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
zoneId);
AudioAttributes attributesWithZone = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.addBundle(bundle)
.build();
//Create focus request using built attributesWithZone
Bu paket parametresi, istek sahibinin otomatik ses bölgesi eşlemelerini geçersiz kılarak belirtilen bölge kimliğini kullanmasına olanak tanır. Bu nedenle, bir uygulama farklı ses bölgeleri için ayrı istekler gönderebilir.
HAL ses odağı
Android 11'den itibaren HAL, harici akışlar adına odaklanma isteğinde bulunabilir. İsteğe bağlı olsa da harici seslerin Android ekosisteminde en iyi şekilde kullanılabilmesi ve sorunsuz bir kullanıcı deneyimi sunulması için bu API'lerin kullanılması önemle tavsiye edilir.
Hangi seslerin öncelikli olması gerektiğine dair nihai kararı HAL verir. Bu nedenle, HAL'e ses odağının verilip verilmediğinden bağımsız olarak acil durum ve güvenlik açısından kritik sesler çalınmalı ve HAL ses odağını kaybetse bile uygun şekilde çalınmaya devam etmelidir. Aynı durum, resmi düzenlemeler uyarınca gerekli olan tüm sesler için de geçerlidir.
HAL, acil durum veya güvenlik açısından kritik seslerin net bir şekilde duyulmasını sağlamak için Android akışlarını gerektiğinde proaktif olarak sessize almalıdır.
AudioControl@2.0
AudioControl HAL'ın 2.0 sürümünde aşağıdaki yeni API'ler kullanıma sunulmuştur:
API | Amaç |
---|---|
IAudioControl#registerFocusListener |
AudioControl HAL ile bir IFocusListener örneği kaydeder. Bu dinleyici, HAL'in ses odağını istemesini ve terk etmesini sağlar. HAl, dinleyicinin kaydını iptal etmek için Android tarafından kullanılacak bir ICloseHandle örneği sağlar. |
IAudioControl#onAudioFocusChange |
İlk odak isteklerine verilen yanıtlar da dahil olmak üzere, HAL tarafından IFocusListener üzerinden yapılan odak isteklerinin durumundaki değişiklikleri HAL'e bildirir. |
IFocusListener#requestAudioFocus
| Belirli bir kullanım, bölge kimliği ve odak kazancı türü için HAL adına odaklanma isteğinde bulunur. |
IFocusListener#abandonAudioFocus |
Belirtilen kullanım ve bölge kimliği için mevcut HAL odaklanma isteklerini terk eder. |
HAL'de aynı anda birden fazla odak isteği olabilir ancak kullanım ve bölge kimliği eşleştirme başına bir istekle sınırlıdır. Android, istek gönderildikten sonra HAL'ın ilgili kullanım için sesleri hemen çalmaya başlayacağını ve odak kaybolana kadar bunu yapmaya devam edeceğini varsayar.
registerFocusListener
dışındaki bu istekler, Android'in bir odaklanma isteği işlenirken HAL'i geciktirmemesi için oneway
olur. HAL, güvenlik açısından kritik sesleri oynatmadan önce odaklanmayı beklememelidir. HAL'in IAudioControl#onAudioFocusChange
üzerinden ses odağındaki değişiklikleri dinlemesi ve bunlara yanıt vermesi isteğe bağlıdır.
OEM araç ses odak hizmeti
Android 14'te AAOS, bazı araç bileşenlerinin yapılandırılabilirliğini sağlamak için araç OEM eklenti hizmetlerini kullanıma sundu. Araç Ses Sistemi Eklentisi Hizmeti için eklenti hizmeti, OEM'lerin araç ses sistemi hizmeti tarafından yakalanan odaklanma isteklerini yönetmesine olanak tanır. Bu sayede OEM'ler, kurallar ve yönetmelikler uyarınca odaklanmayı yönetme konusunda daha fazla esneklik elde eder. Bu nedenle, ses odak etkileşimi üreticiler ve bölgeler arasında farklılık gösterebilir. Ses odağının temel fikri geçerliliğini koruyor. Uygulamaların, kullanıcı deneyimini iyileştirmek için sesleri daha iyi yönetmek amacıyla odak isteğinde bulunması gerekiyor. Genel olarak, uygulamaların ses odak isteğinde bulunması için belirli kurallar geçerli olmaya devam eder:
Telefon araması, acil durum uyarısı veya güvenlik bildirimi dahil olmak üzere herhangi bir kalıcı yüksek öncelikli ses odak noktası olmadan uygulamalar geçici veya kalıcı olarak ses odak noktası elde edebilmelidir.
Medya odağı etkinken:
Telefon kullanımı odağına odaklanmayı isteyen uygulamalar, aramayı eşzamanlı olarak veya münhasıran alabilmelidir.
Gezinme kullanımı odağı isteyen uygulamalar, gezinme odağını eşzamanlı olarak veya münhasıran alabilmelidir.
Asistan kullanım odağını isteyen uygulamalar, kullanım odağını eşzamanlı olarak veya münhasıran alabilmelidir.
Ayaktayken yüksek öncelikli ses odaklı uygulamalar (telefon araması, acil durum uyarısı veya güvenlik bildirimi dahil) etkinken gelen gecikmeli ses odaklı isteklerin tümü izin verilmeli veya gerektiği şekilde ertelenmelidir.
Yukarıdaki öneriler her şeyi kapsamasa da etkin yüksek öncelikli ses yoksa odaklanma isteğinde bulunan uygulamaların odaklanmasına yardımcı olabilir. Yüksek öncelikli sesler etkinken bile gecikmeli odaklanma isteklerine yine de uyulmalıdır ve yüksek öncelikli ses durduğunda odaklanmaya başlanabilmelidir.