In Android 10 ersetzt car_audio_configuration.xml
car_volumes_groups.xml
und IAudioControl.getBusForContext
.
In der neuen Konfigurationsdatei ist eine Liste von Zonen definiert. Jede Zone hat eine oder mehrere
und jedes Gerät hat die Kontexte,
innerhalb dieser Zone verlegt werden. Alle Kontexte müssen repräsentiert sein
in jeder Zone.
Audiorouting konfigurieren
Die Audiorichtliniendateien, die sich
in der Regel in der Anbieterpartition befinden,
der Audiohardwarekonfiguration des Boards. Alle Geräte, auf die verwiesen wird in
car_audio_configuration.xml
muss im
audio_policy_configuration.xml
.
AAOS-Routing aktivieren
Um AAOS-basiertes Routing zu verwenden, müssen Sie den Parameter
Flag audioUseDynamicRouting
in true
:
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
Wenn false
, werden Routing und ein Großteil von CarAudioService
deaktiviert und
Das Betriebssystem greift auf das Standardverhalten von AudioService
zurück.
Primäre Zone
Standardmäßig werden alle Audiodaten an die primäre Zone geleitet. Es können nur
eine primäre Zone sein, die in der Konfiguration durch das Attribut
isPrimary="true"
Beispielkonfiguration
Zum Beispiel könnte ein Fahrzeug zwei Zonen haben: eine primäre Zone und einen Rücksitz.
Unterhaltungssystem. Damit könnte ein car_audio_configuration.xml
wie folgt definiert:
<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>
Hier hat die primäre Zone verschiedene Kontexte für verschiedene Geräte getrennt. Dies ermöglicht
den HAL, um verschiedene Nachbearbeitungseffekte und Mischen auf die einzelnen Geräteausgaben anzuwenden.
mit der Hardware des Fahrzeugs. Die Geräte sind in vier Volumengruppen unterteilt:
Medien, Navigation, Anrufe und Wecker. Wenn das System so konfiguriert ist,
useFixedVolume
, dann werden die Lautstärkepegel für jede Gruppe übergeben.
auf den HAL, der auf die Ausgabe dieser Geräte angewendet wird.
Für die sekundäre Zone wird die Ausgabe über ein einzelnes Ausgabegerät erwartet. In diesem Beispiel werden alle Nutzungen an das einzelne Gerät und die und die Dinge einfach halten.
Audiokonfiguration der Insassenzone
In Android 11 wurde car_audio_configuration.xml
weiter auf
werden zwei neue Felder eingeführt: audioZoneId
und occupantZoneId
.
Die erste, audioZoneId
, kann zur besseren Steuerung der Zonenverwaltung verwendet werden.
Mit occupantZoneId
kann dagegen die User-ID-basierte Konfiguration
Routenplanung.
Um diese neuen Felder zu verwenden, ist V2 von car_audio_configuration.xml
erforderlich. Wir gehen noch einmal auf die Audiokonfiguration oben zurück,
verwenden aber das neue Feld für
ID der Insassenzone und Zuordnung der Audiozone, die neue Konfiguration ohne Lautstärke
Gruppendefinitionen können folgendermaßen eingerichtet werden:
<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>
Die obige Konfiguration definiert eine Zuordnung der primären Zone zur Insassenzone 0.
audioZoneId
1 bis occupantZoneId
1. Im Allgemeinen
Insassenbereich und Audiobereich können konfiguriert werden, die Zuordnung muss jedoch 1:1 erfolgen.
Dies sind die Regeln, anhand derer die beiden neuen Felder definiert wurden:
audioZoneId
für die primäre Zone ist immer nullaudioZoneId
- undoccupantZoneId
-Nummern dürfen nicht wiederholt werdenaudioZoneId
undoccupantZoneId
können nur eine 1:1-Zuordnung haben
Routing über eine Anwendungs-UID
In 10 wurden in CarAudioManager
eine Reihe verborgener APIs eingeführt, um Apps zu ermöglichen.
um Audiozonen und den Fokus festzulegen.
int[] getAudioZoneIds(); int getZoneIdForUid(int uid); boolean setZoneIdForUid(int zoneId, int uid); boolean clearZoneIdForUid(int uid);
Mit den oben genannten APIs kann eine Erstanbieteranwendung Audiorouting-basierte
auf der UID einer Anwendung. Daher ist sowohl die Audiozonen-ID als auch die UID der Anwendung
auch erforderlich. Anhand dieser Informationen kann das Audio-Routing mit dem
CarAudioManager#setZoneIdForUid
-API.
Zonen für eine App ändern
Standardmäßig werden alle Audio-Routen zur primären Zone geleitet. Um eine Anwendung auf
An eine andere Zone weitergeleitet, verwenden Sie 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"); }
N Hinweis:Bei Streams und Fokus kann der Bereich nicht dynamisch gewechselt werden. Dementsprechend wird muss die Wiedergabe angehalten und der Fokus neu auf das Wechseln der Zonen angefordert werden.
Routing mit Nutzer-ID
Während das UID-basierte Routing einer Anwendung die Feinsteuerung der
Audiorouting ist es außerdem erforderlich, dass das Audiorouting für jede Anwendung vorab definiert wird
an die Anwendung anfordert,
die den Audiofokus anfordert und Audio wiedergibt. Um dies zu vermeiden
Drittanbieter-Apps die Ausgabe von Audioinhalten ohne Modifizierung zu ermöglichen und diese zu ermöglichen,
CarAudioService
verwendet die Zuordnung von Insassenbereichen und Audiozonen, um zu definieren,
das auf Nutzer-IDs basierende Routing. Wenn sich ein Nutzer dann im Insassenbereich anmeldet, wird das Audio des Autos
wenn der Dienst benachrichtigt wird. Mit diesem Signal werden Audiofokusverwaltung und Routing automatisch
die für alle Audiozonen konfiguriert sind.
UID-basiertes Routing von Anwendungen kann weiterhin verwendet werden, muss jedoch unabhängig von
Nutzer-ID-Routing. Wenn also die Zuordnung der Insassenzone zum Audiobereich des Autos
wird das UID-basierte Routing deaktiviert und es wird versucht,
CarAudioManager#setZoneidForUid
gibt einen Fehler aus.
Audiorouting und Fokusverwaltung wurden zwar mit Insassenbereichen vereinfacht
muss der Nutzer trotzdem einer Insassenzone zugewiesen sein. Dies kann durch
mit CarOccupantZoneManager#assignProfileUserToOccupantZone
. Dieses
Die API benötigt die Berechtigung zum Verwalten von Nutzern. Derzeit wird davon ausgegangen, dass OEMs
Zuweisung von Insassenbereichen über eine Art System-UI. Sobald das erledigt ist,
Starten, Audiorouting und Fokusverwaltung werden automatisch für den Nutzer konfiguriert.
Routing mit setPreferredDevice
Neben den oben genannten Änderungen bietet Android 11 auch eine neue API zur Abfrage von Ausgabegeräten CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage) ein.
Mit der API kann ein Ausgabegerät für eine bestimmte Zone und ein Audioattribut abgefragt werden
Nutzung. Auf diese Weise können Erstanbieter-Apps
mithilfe der setPreferredDevice
API des Players. Die
getOutputDeviceForUsage
API erfordert
PERMISSION_CAR_CONTROL_AUDIO_SETTINGS
und ist eine System-API. Unten sehen Sie eine
Beispiel für die Suche nach dem Mediengerät für eine bestimmte Zone und das Routing zu diesem Gerät
mit der setPreferredDevice
API.
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);