W Androidzie 10 car_audio_configuration.xml
zastępuje
car_volumes_groups.xml
i IAudioControl.getBusForContext
.
W nowym pliku konfiguracji zdefiniowano listę stref. W każdej strefie obowiązuje co najmniej 1
grup głośności z powiązanymi urządzeniami, a każde urządzenie ma kontekst,
powinien być kierowany w obrębie tej strefy. Musisz uwzględnić wszystkie konteksty
w każdej strefie.
Konfigurowanie kierowania dźwięku
Pliki zasad audio, które zwykle znajdują się na partycji dostawcy, reprezentują
konfiguracji sprzętowej płytki. Wszystkie urządzenia wymienione w
Pole car_audio_configuration.xml
musi być zdefiniowane w tagu
audio_policy_configuration.xml
Włączam routing AAOS
Aby używać routingu w oparciu o AAOS, musisz ustawić
Flaga audioUseDynamicRouting
do użytkownika true
:
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
Gdy false
, routing i znaczna część obszaru CarAudioService
zostaną wyłączone i
system operacyjny wróci do domyślnego działania z AudioService
.
Główna strefa
Domyślnie cały dźwięk będzie kierowany do strefy głównej. Można tam znaleźć tylko
być jedną strefą główną wskazaną w konfiguracji przez atrybut
isPrimary="true"
Przykładowa konfiguracja
Na przykład pojazd może mieć 2 strefy: główną i tylną.
system multimedialny. Dzięki temu możliwe car_audio_configuration.xml
została zdefiniowana w ten sposób:
<audioZoneConfiguration version="2.0"> <zone name="primary zone" isPrimary="true"> <volumeGroups> <group> <device address="bus0_media_out"> <context context="music"/> <context context="announcement"/> </device> <device address="bus3_call_ring_out"> <context context="call_ring"/> </device> <device address="bus6_notification_out"> <context context="notification"/> </device> <device address="bus7_system_sound_out"> <context context="system_sound"/> <context context="emergency"/> <context context="safety"/> <context context="vehicle_status"/> </device> </group> <group> <device address="bus1_navigation_out"> <context context="navigation"/> </device> <device address="bus2_voice_command_out"> <context context="voice_command"/> </device> </group> <group> <device address="bus4_call_out"> <context context="call"/> </device> </group> <group> <device address="bus5_alarm_out"> <context context="alarm"/> </device> </group> </volumeGroups> </zone> <zone name="rear seat zone" audioZoneId="1"> <volumeGroups> <group> <device address="bus100_rear_seat"> <context context="music"/> <context context="navigation"/> <context context="voice_command"/> <context context="call_ring"/> <context context="call"/> <context context="alarm"/> <context context="notification"/> <context context="system_sound"/> <context context="emergency"/> <context context="safety"/> <context context="vehicle_status"/> <context context="announcement"/> </device> </group> </volumeGroups> </zones> </audioZoneConfiguration>
W tym przypadku strefa główna oddzielyła konteksty na różne urządzenia. Dzięki temu
HAL, aby stosować różne efekty końcowe i miksować na poszczególnych urządzeniach wyjściowych
za pomocą elementów wyposażenia pojazdu. Urządzenia są podzielone na 4 grupy głośności:
multimedia, nawigacja, połączenia i alarmy. Jeśli system jest skonfigurowany do
useFixedVolume
, zostaną przekazane poziomy głośności każdej grupy
na interfejs HAL, aby zastosować go do danych wyjściowych tych urządzeń.
W strefie dodatkowej oczekiwane dane wyjściowe pochodzą z jednego urządzenia wyjściowego. W tym przykładzie wszystkie przypadki użycia są kierowane do jednego urządzenia i grupy woluminów Uprość wszystko.
Konfiguracja dźwięku w strefie osób
W Androidzie 11 system car_audio_configuration.xml
został dodatkowo rozszerzony do
wprowadź dwa nowe pola: audioZoneId
i occupantZoneId
.
Pierwszych, audioZoneId
, można używać do lepszego zarządzania strefami.
Z kolei środowisko occupantZoneId
może służyć do konfigurowania identyfikatora użytkownika na podstawie identyfikatora użytkownika,
.
Aby można było korzystać z tych nowych pól, wersja 2 car_audio_configuration.xml
jest
Wracam do powyższej konfiguracji audio, ale korzystam z nowego pola
identyfikator strefy użytkownika i mapowanie identyfikatora strefy audio, nowa konfiguracja bez głośności.
definicje grup można skonfigurować w ten sposób:
<audioZoneConfiguration version="2.0"> <zone name="primary zone" isPrimary="true" occupantZoneId="0"> ... </zone> <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1"> ... </zone> </zones> </audioZoneConfiguration>
Powyższa konfiguracja definiuje mapowanie strefy głównej na strefę 0 użytkowników.
audioZoneId
1 do occupantZoneId
1. Ogólnie każde mapowanie
można skonfigurować między strefą użytkownika i dźwiękiem, ale mapowanie musi odbywać się w trybie „jeden do jednego”.
Oto reguły, które zdefiniowały te 2 nowe pola:
audioZoneId
strefy głównej zawsze wynosi 0- Numery
audioZoneId
ioccupantZoneId
nie mogą się powtarzać - Mapowanie
audioZoneId
ioccupantZoneId
może mieć tylko mapowanie 1 do 1
Routing przez identyfikator UID aplikacji
W 10 aplikacjach CarAudioManager
wprowadzono szereg ukrytych interfejsów API, aby umożliwić aplikacjom
zapytania, ustawianie stref audio i skupienie się na nich.
int[] getAudioZoneIds(); int getZoneIdForUid(int uid); boolean setZoneIdForUid(int zoneId, int uid); boolean clearZoneIdForUid(int uid);
Powyższe interfejsy API zezwalały własnym aplikacjom do zarządzania routingiem audio na podstawie
w UID aplikacji. Oznacza to, że zarówno identyfikator strefy audio, jak i UID aplikacji są
które są potrzebne. Mając te informacje, można ustawić routing dźwięku za pomocą
Interfejs API CarAudioManager#setZoneIdForUid
.
Zmienianie stref w przypadku aplikacji
Domyślnie wszystkie trasy audio do strefy głównej. Aby zaktualizować aplikację tak, aby była
kierowany do innej strefy, użyj CarAudioManager#setZoneIdForUid
:
// Find zone to play int zoneId = ... // Find application's uid Int uid = mContext.getPackageManager() .getApplicationInfo(mContext.getPackageName(), 0) .uid; if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) { Log.d(TAG, "Zone successfully updated"); } else { Log.d(TAG, "Failed to change zone"); }
Płn. Uwaga: strumienie i fokus nie mogą dynamicznie przełączać się stref. Dlatego odtwarzanie musi zostać zatrzymane i trzeba ponownie ustawić ostrość, aby zmienić strefę.
Routing z wykorzystaniem identyfikatora użytkownika
Z kolei routing na podstawie identyfikatora UID aplikacji zapewnia precyzyjną kontrolę
routingu audio, wymaga również zdefiniowania takiego kierowania dla każdej aplikacji
do aplikacji, która rzeczywiście prosi o zaznaczenie
dźwięku i je odtwarza. Aby temu zaradzić
i ułatwiać aplikacjom innych firm odtwarzanie dźwięku bez modyfikacji,
CarAudioService
używa mapowania strefy pasażera i strefy audio, aby określić
routingu na podstawie identyfikatora użytkownika. Dzięki temu, gdy użytkownik zaloguje się w strefie pasażera,
usługa została powiadomiona. W przypadku tego sygnału zarządzanie skupieniem dźwięku i przekierowanie są automatycznie
skonfigurowana we wszystkich strefach audio.
Możesz nadal używać routingu w oparciu o identyfikator UID aplikacji, ale musisz to robić niezależnie
identyfikatora użytkownika. Oznacza to, że jeśli mapowanie stref pasażerów na strefy audio w samochodzie jest
to kierowanie ruchem oparte na UID jest wyłączone i próba wywołania
CarAudioManager#setZoneidForUid
zgłosi błąd.
Uprościliśmy kierowanie dźwięku i zarządzanie ostrością dzięki funkcji Strefy obecności
użytkownik musi być przypisany do strefy gości. Może to zrobić:
za pomocą funkcji CarOccupantZoneManager#assignProfileUserToOccupantZone
. Ten
Interfejs API wymaga uprawnień do zarządzania użytkownikami. Obecne wymagania wobec dostawców OEM w zakresie zarządzania
przypisanie użytkownika do strefy za pomocą interfejsu użytkownika systemu. Po wykonaniu tych czynności zgłoszenie
uruchamianie, routing audio i zarządzanie ostrością zostaną automatycznie skonfigurowane dla użytkownika.
Routing z ustawieniem setPreferredDevice
Oprócz powyższych zmian Android 11 ma również nowy interfejs API do wysyłania zapytań dotyczących urządzeń wyjściowych powiązane z poszczególnymi strefami, CarAudioManager#getOutputDeviceForUsage(intzoneId, int use).
Interfejs API może służyć do wysyłania zapytań do urządzenia wyjściowego dotyczących określonej strefy i atrybutu audio.
i ich wykorzystaniu. Dzięki temu własne aplikacje mogą kierować dźwięk do różnych stref,
za pomocą interfejsu API odtwarzacza setPreferredDevice
.
Wymagania interfejsu API: getOutputDeviceForUsage
PERMISSION_CAR_CONTROL_AUDIO_SETTINGS
to systemowy interfejs API. Poniżej znajdziesz
przykład znajdowania urządzenia multimedialnego w konkretnej strefie i kierowania na nie urządzenia
za pomocą interfejsu API setPreferredDevice
.
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);