Android 14'teki yeni araç OEM eklenti hizmetleri, bazı araç bileşenlerinin yapılandırılmasını sağlar. Özellikle ses için OEM'lerin AAOS cihazlarda ses yönetimini esnek bir şekilde yapılandırmasına olanak tanıyan üç yeni eklenti hizmeti kullanıma sunulmuştur:
- Ses odağı kontrolü
- Ses seviyesi ve sessize alma kontrolü
- Sesi kısma kontrolü
Araba eklentisi hizmet mimarisi
Aşağıdaki resimde, araç hizmetlerine ve OEM araç hizmetleriyle olan ilişkilerine genel bir bakış sunulmaktadır. Uygulama süreçlerine ve araç servisi sürecine benzer şekilde OEM araç servisi süreci de kendi işlem alanında yer alır.
Araç servisi, config_oemCarService
içinde tanımlanan bileşeni bularak OEM araç hizmetini başlatır. Yapılandırma boşsa OEM hizmeti mevcut değildir ve hiçbir hizmet başlatılmaz. Bileşen, OemCarService öğesini genişletmelidir.
Araba ses sistemi hizmeti, araba ses sistemi OEM hizmetini almak için API'lerin üzerine yazmalıdır:
public final class OemCarServiceImp extends OemCarService {
@Override
public OemCarAudioFocusService getOemAudioFocusService();
@Override
public OemCarAudioDuckingService getOemAudioDuckingService();
@Override
public OemCarAudioVolumeService getOemAudioVolumeService();
}
Örneğin, packages/services/Car/tests/OemCarServiceTestApp
dosyasında tanımlanan referans test uygulamasına bakın.
Hizmet, araç servisi tarafından başlatılsa bile araç ses hizmetinin sahip olduğu izinleri otomatik olarak devralmaz. Bu nedenle, OEM hizmetlerinin gerektirdiği tüm izinler uygun mekanizmayla alınmalıdır. Örneğin, packages/services/Car/data/etc/com.android.car.oemcarservice.testapp.xml
adresine bakın.
OEM hizmet mimarisi ile araç ses sistemi hizmeti
AAOS'te araç ses hizmeti aşağıdaki işlemleri yönetir:
- Ses yönlendirme
- Ses odağı
- Sesi kısma
- Ses düzeyi ve sessize alma
Android 14'ten önce bu davranış büyük ölçüde statik olup yalnızca çok sınırlı durumlarda ayarlar aracılığıyla değiştirilebiliyordu. Android 14, araç ses hizmetinin aşağıdakileri yöneten OEM tanımlı bir bileşenle iletişim kurması için bir mekanizma sundu:
- Ses odağı
- Sesi kısma
- Ses düzeyi ve sessize alma
Aşağıdaki şekilde, araç ses hizmeti ve araç OEM hizmeti için basitleştirilmiş bir mimari gösterilmektedir. Araba ses hizmeti, ses davranışını yönetmek için araba OEM ses hizmetini çağırabilecek farklı kancaları tanımlar. İkincisi yalnızca ilgili OEM araç ses hizmeti bileşeni tanımlanmışsa gerçekleşir. Aksi takdirde, araç ses hizmeti varsayılan davranışı kullanır.
Araç ses hizmeti ve araç OEM ses hizmetinin her zaman senkronize olmasını sağlamak için araç ses hizmeti, her çağrıda ses yığınının mevcut durumunun gerekli bölümlerini araç OEM ses hizmetine iletir. Örneğin, araç ses hizmeti ses odağını değerlendirme isteğini yakaladığında, yığının mevcut durumunu araç OEM ses hizmetine iletir. Mevcut durum, mevcut odak sahibini ve mevcut odak kaybedenlerini içerir. Odak kaybedenler, yığının parçası olan ancak geçici olarak odağı kaybeden odaklanma isteklerinden oluşur.
Araç ses hizmeti, araçtaki tüm ses etkinliklerini yönetmelidir. Araç ses hizmeti, ses davranışının bazı bölümlerini yönetmiyorsa araç OEM ses hizmetine sunulan bilgiler eksiktir. Örneğin, bir OEM kendi ses odak politikasını kaydederek araç hizmetindeki ses odak işlemenin üzerine yazarsa araç ses hizmeti, araç OEM ses hizmetine tam bilgi sağlayamaz. Bu durum, araç OEM ses hizmetinin görmediği bilgiler eksik olabileceğinden araç ses hizmetinin karar verme yeteneğini etkileyebilir.
Araç ses hizmeti, işlem yapmak için OEM araç hizmetlerini çağırır. Bu çağrılar, işlemler arasında yapılır ve işlemler arası iletişim (IPC) gerektirir. IPC, her çağrıya gecikme ekler. OEM hizmetinde gecikmeyi en aza indirmek önemlidir.
OEM hizmetine yapılan araç ses sistemi hizmet çağrıları engellendiğinden OEM hizmeti, doğrudan API değerlendirmelerinde araç ses sistemi hizmetini çağırmamalıdır. Bunun yerine, araç ses hizmeti gerekli bilgileri sağlar. Böylece iki işlem arasındaki aramaların yalnızca tek bir yönde yapılması gerekir.
OEM araç ses hizmeti tanımları
OEM araç ses odak hizmeti
Araba ses hizmeti, ses politikası odak dinleyicisi kaydederek uygulamalardan gelen ses odak isteklerini yönetir. Araç ses hizmeti, statik bir etkileşim matrisine göre odaklanma davranışını yönetmek için bir mekanizmaya sahiptir. Matris üç farklı etkileşim türünü tanımlar:
Eşzamanlı etkileşim. Odak tutucular aynı anda odaklanmaya devam edebilir.
Özel etkileşimler. Gelen odak isteği, odağı mevcut odak sahibinden alır.
Etkileşimde bulunmayı reddedin. Gelen odak isteği, mevcut odak sahibine göre reddedildi.
Bu, bazı otomotiv kullanım alanları için yeterli olsa da OEM gereksinimleri nedeniyle farklılık gösterebilecek tüm etkileşim ihtiyaçlarını karşılamıyor. Bunun için OemCarAudioFocusService
'ü kullanıma sunuyoruz:
public interface OEmCarAudioFocusService {
OemCarAuddioFocusResults evaluateAudioFocusRequest(
OemCarAudioFocusEvaluationRequest request);
void notifyAudioFocusChange(
List<AudioFocusEntry> holder,
List<AudioFocusEntry> losers, int zoneId);
}
evaluateAudioFocusRequest
API'si, değerlendirilmesi gereken bir ses odak isteği olduğunda her zaman araç ses hizmetinden çağrılır. Sonuçların döndürülmesini engelleyen iki yönlü bir API'dir. İstek, ses yığınının mevcut durumuyla ilgili bilgileri içerir:
Bu bilgiler, newFocusRequest
'ü focusHolders
'daki mevcut odak sahipleri ve focusLosers
'deki mevcut odak kaybedenlerle karşılaştırmak için kullanılabilir. API aşağıdaki sonuçları döndürmelidir:
class OemCarAudioFocusResult {
int audioZoneId;
int audioFocusEvaluationResults;
AudioFocusEntry focusResult;
List<AudioFocusEntry> newLosers;
List<AudioFocusEntry> newlyBlocked;
}
Bu, audioFocusEvaluationResults
'teki gerçek değerlendirme sonuçlarıyla ilgili bilgileri içerir. Bu bilgiler, mevcut isteğin onaylanıp onaylanmadığını, geciktirilip geciktirilmediğini veya başarısız olup olmadığını gösterir. Mevcut odak grubunda yapılan tüm değişiklikler, grup değişikliğinin niteliğine bağlı olarak newLosers
ve newlyBlocked
girişlerinde ayarlanmalıdır.
Burada newLosers
, daha önce odağa sahip olan ancak artık kalıcı veya geçici olarak odağı kaybetmesi gereken girişleri içerir. Kalıcı olarak odağı kaybedenler ses odağı yığınından kaldırılır. Geçici olarak odağı kaybedenler ise odağı tekrar kazanana veya orijinal odağı isteyen tarafından terk edilene kadar mevcut odağı kaybedenler yığınına taşınır. Bununla birlikte, isteklerin odak dinleyicisi, ilgili odak kaybını alır.
newlyBlocked
listesi, daha önce odaklanmayı kaybedenler listesinde yer alan ancak şu anda yeni giriş tarafından engellenen girişleri içerir. Engelleme kalıcı veya geçici olabilir. Kalıcı olarak engellenen odak için giriş yığından kaldırılır ve odak kaybı, odak dinleyicilerine gönderilir. Geçici odaklanma kaybı için giriş, odaklanmayı kaybedenler yığınında kalır ancak engelleyen listesine yeni bir odaklanma engelleyici eklenir. İlk kez engellendiğinde gönderildiği için odaklanma kaybı gönderilmez. Mevcut tüm engelleyiciler kaldırıldığında isteğin engellemesi kaldırılır veya odak bırakılırsa istek yığından kaldırılır.
İkinci API olan notifyAudioFocusChange
, her ses odak isteği veya vazgeçme durumunda çağrılan tek yönlü bir API'dir. API, çoğunlukla OEM servisini, OEM araç ses hizmetinin davranışını etkileyebilecek odak değişiklikleri hakkında bilgilendirmek için kullanılır.
Odak değerlendirmesi yönergeleri
AAOS'te ses oynatmayı yönetmek ve kullanıcıya en iyi deneyimi sunmak için hangi uygulamanın kullanılacağını belirlemek üzere ses odak noktası kullanılır. Bu nedenle, OEM eklenti hizmeti ses odak isteğini yönetirken aşağıdakileri dikkate almalıdır:
Sabit yüksek öncelikli ses odak noktası (ör. telefon görüşmesi, acil durum veya güvenlik) olmadan uygulamalar geçici veya kalıcı olarak ses odak noktası kazanabilmelidir.
Medya odağı etkinken aşağıdakileri isteyen uygulamalar:
Arama kullanımı odağı, eşzamanlı olarak veya münhasıran odak alabilmelidir.
Gezinme kullanımı odağı, aynı anda veya münhasıran odak alabilmelidir.
Asistan kullanım odak noktası, eşzamanlı veya münhasır olarak odaklanabilmelidir.
Yüksek öncelikli ses odaklı uygulamalar (ör. telefon araması, acil durum uyarısı veya güvenlik uyarısı) etkinken gelen gecikmeli ses odaklı isteklerin gerektiği şekilde verilmesi veya ertelenmesi gerekir.
Yukarıdaki öneriler her şeyi kapsamasa da etkin yüksek öncelikli sesler olmadığında odaklanma isteğinde bulunan uygulamaların odaklanabilmesini garanti etmeye 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 geçilmelidir.
OEM araç ses düzeyi hizmeti
Araç ses hizmeti, ses tuşu etkinliklerini ses sisteminden gelen ses ayarlarını dinleyerek veya ses tuşu etkinliklerini doğrudan araç giriş hizmetinden dinleyerek yönetir. Her durumda, araç ses hizmetinin varsayılan davranışı, etkin ses oynatıcılara ve ses bağlamı öncelik listesine göre hangi ses grubunun değiştirileceğini belirlemektir.
İki adet hacim öncelik listesi sağlarız. İlk listede tüm ses bağlamları bu sırada dikkate alınır. Liste azalan düzende sunulur. En yüksek öncelikli öğeler en üstte, en düşük öncelikli öğeler ise en altta yer alır. Örneğin, hem navigasyon sesi hem de müzik sesi aynı anda etkinse ses tuşu etkinliği sırasında navigasyon sesi değiştirilir.
- Navigasyon
- Ara
- Müzik
- Duyuru
- Sesli komut
- Sesli aramada zil çalsın
- Sistem sesi
- Güvenlik
- Alarm
- Bildirim
- Araç durumu
- Acil durum
Ses düğmesi etkinliği yönetimini daha az karmaşık hale getirmek için araç ses hizmetinin ses bağlamıyla ilgili ikinci bir öncelik listesi vardır:
- Ara
- Medya
- Duyuru
- Sesli komut
Bu liste de azalan düzende sunulur. Bu ikinci listenin amacı, önemli etkinlikler aracılığıyla daha yaygın seslerin değiştirilmesine olanak tanımaktır. Sık kullanılmayan ve daha kısa süreli sesler yalnızca ses ayarları kullanıcı arayüzü üzerinden yönetilebilir.
Ses seviyesinin gerçek sürümü, audioVolumeAdjustmentContextsVersion
yapılandırmasıyla ayarlanabilir. Yapılandırma 1
veya 2
olarak ayarlanabilir (2
varsayılan ayardır).
Android 14'te ses seviyesi yönetimine daha fazla esneklik sağlamak için OemCarAudioVolumeService
özelliği kullanıma sunulmuştur:
public interface OemCarAudioVolumeService {
OemCarvolumeChangeInfo getSuggestedGroupForVolumeChange(
OemCarAudioVolumeRequest request, int volumeAdjustment);
}
OEM araç ses seviyesi hizmetinin, volumeAdjustment
ve OemCarAudioVolumeRequest
alanlarını alan tek bir yöntemi vardır:
class OemCarAudioVolumeRequest {
int audioZoneId;
int callState;
List<AudioAttributes> activePlaybackAttributes;
List<AudioAttributes> duckedAttributes;
List<CarVolumeGroupInfo> volumeGroupState;
}
İsteğin activePlaybackAttributes
bölümünde etkin ses özellikleri bulunur. duckedAttributes
, şu anda sessizleştirilmiş ses özellikleridir. volumeGroupState
, birim grubun mevcut durumunu içerir. İstek, ses yığınının mevcut durumunu temsil eder ve hangi ses grubunun değiştirileceğini belirlemek için kullanılabilir. Sonuçlar OemCarVolumeChangeInfo
biçiminde döndürülmelidir:
class OemCarVolumeChangeInfo {
boolean change;
CarVolumeGroupInfo volumeGroupChanged;
}
change
boole değeri, herhangi bir hacmin değişip değişmediğini, true
ise bir değişiklik olduğunu ve hacim grubunun güncellenmesi gerektiğini gösterir. volumeGroupChanged
, değiştirilmesi gereken gerçek ses grubudur. Bu grup, API'ye iletilen orijinal volumeAdjustment
parametresine göre değiştirilmelidir. Örneğin, sonuçlarda gezinme ses grubu için sessiz modun etkinleştirilmesi gerektiği belirtiliyorsa boole değeri true
olur ve döndürülen ses grubu, gezinme için olan ses grubu olur.
OEM araç ses azaltma hizmeti
Araç ses hizmeti, ses odak değişikliklerini izleyerek ve AudioControl
HAL'e hangi ses cihazlarının sessizleştirileceğiyle ilgili bir sinyal göndererek ses azaltmayı yönetir.
Odak değiştiğinde, statik karartma kuralları grubuna göre hangilerinin karartılması gerektiğini belirlemek için tüm etkin odak tutucular değerlendirilir:
- Acil durum sesleri, arama sesleri dışındaki her şeyi engeller
- Güvenlik, acil durum sesleri dışındaki her şeyi engeller
- Navigasyon, güvenlik ve acil durum sesleri dışındaki her sesi engeller
- Güvenlik, acil durum ve navigasyon sesleri dışındaki tüm sesleri engeller
- Sesli arama ördeği zil sesleri
- Müzik ve duyurular her şeyden daha az duyulmalıdır
Bu kurallar kapsamlı değildir ve OEM'ler, bu yönergelere göre seslerin nasıl azaltılması gerektiğini belirlemekten sorumludur. OEM'ler, mevcut koşullara göre bu önerileri daha etkin bir şekilde kontrol edebilir. Android 14'te OemCarDuckingService
kullanıma sunulmuştur:
class OemCarAudioDuckingService {
List<AudioAttributes> evaluateAttributesToDuck(
OemCarAudioVolumeRequest request);
}
Bu API, ses odak değişikliklerinde araç ses hizmetinden çağrılır. OEM araç ses seviyesi hizmetinde tanıtılan OemCarAudioVolumeRequest
öğesini yeniden kullanır ve hangi özelliklerin gizleneceğine karar vermek için gerekli bilgileri içerir. API'den atlanacak ses özelliklerinin listesi, mevcut ses durumuyla karşılaştırılır:
Şu anda azaltılmış ses özelliği:
- Listede, engellenmeye devam ediyor
- Listede yok, ses azaltma kapalı
Ses özelliği şu anda azaltılmamış:
- Listede, gizlenmiş
- Listede yok, ses azaltma kapalı
Ardından araç ses hizmeti, ses özelliklerinin hangi ses çıkış cihazlarına ait olduğunu belirler ve bunları sırasıyla ses azaltılmış ses çıkış cihazı listesine veya ses azaltılmamış ses cihazları listesine ekler. Bu, gerekli ses azaltmayı donanım seviyesinde gerçekleştirmek için AudioControl HAL'e gönderilir.
Aşağıdaki şekilde, OEM ses azaltma hizmeti kullanıldığında bir odaklanma isteği için ses azaltma kontrolünün basitleştirilmiş bir sıra diyagramı gösterilmektedir:
Sırası, bir uygulama herkese açık ses yöneticisi API'leri aracılığıyla Ses odağını yönet isteği gönderdiğinde başlar. Sonuçların belirlenmesi için istek, araç ses hizmetine yönlendirilir. Ses odağına karar verildiğinde, hangi ses özelliklerinin azaltılması gerektiğini değerlendirmek için OemCarAudioDuckingService
çağrısı yapan araç ses hizmeti tarafından ses azaltma işlemi değerlendirilir. Sonuçlar evaluateAttributesToDuck
API'sinden döndürüldükten sonra, ses cihazlarının ses seviyesi düşürülür ve son olarak ses donanımına ses seviyesi düşürme işlemi uygulanmak üzere bilgiler AudioControl
'e gönderilir.
OEM araç ses hizmeti referans uygulaması
AAOS, packages/services/Car/tests/OemCarServiceTestApp
'te OEM araç hizmetinin referans uygulamasını sağlar. Bu uygulama, OemCarService
'un yanı sıra OemCarAudioFocusService
, OemCarAudioDuckingService
ve OemCarAudioVolumeService
'i de uygular. İkinci durumda, her hizmet statik bir davranış yüklemek için bir XML dosyası kullanır. Örneğin, OemCarAudioFocusServiceImp
bir etkileşim matrisi içeren oem_focus_config.xml
öğesini yükler. Matris, evaluateAudioFocusRequest
çağrıldığında odak isteğini değerlendirmek için kullanılır.
Referans test uygulamasında hata ayıklama
OEM araç servisi test uygulaması, AOSP kaynak kodunun bir parçasıdır. OEM'ler ihtiyaçlarına göre değişiklik yapabilir. Hata ayıklama için test uygulamasını etkinleştirmek üzere config_oemCarService
yapılandırmasını kullanın.
<!-- This is the component name for the OEM customization service. OEM can choose to implement
this service to customize car service behavior for different policies. If OEMs choose to
implement it, they have to implement a service extending OemCarService exposed by car-lib,
and implement the required component services.
If the component name is invalid, CarService would not connect to any OEM service.
Component name can not be a third party package. It should be pre-installed -->
<string name="config_oemCarService" translatable="false">
com.android.car.oemcarservice.testapp/.OemCarServiceImpl
</string>
OEM araç hizmetinin OEM hizmeti için araç hizmeti dump
komutunu kullandığını doğrulamak üzere:
adb shell dumpsys car_service --oem-service
Sonuçlar aşağıdaki çıkışa benzer olabilir:
***CarOemProxyService dump***
mIsFeatureEnabled: true
mIsOemServiceBound: true
mIsOemServiceReady: true
mIsOemServiceConnected: true
mInitComplete: true
OEM_CAR_SERVICE_CONNECTED_TIMEOUT_MS: 5000
OEM_CAR_SERVICE_READY_TIMEOUT_MS: 5000
mComponentName: com.android.car.oemcarservice.testapp/.OemCarServiceImpl
Her dump
bilgi grubundaki her doğru/yanlış değer, özelliğin ve hizmetin durumunu belirler. Örneğin, hizmetin kullanıma hazır olup olmadığını belirten mIsOemServiceReady
bilgi dökümünde true
hazır olduğunu, false
ise hazır olmadığını belirtir.