In Android 10 wird car_audio_configuration.xml
anstelle von car_volumes_groups.xml
und IAudioControl.getBusForContext
verwendet.
In der neuen Konfigurationsdatei wird eine Liste von Zonen definiert. Jede Zone hat eine oder mehrere Volumegruppen mit den zugehörigen Geräten. Jedes Gerät hat die Kontexte, die innerhalb dieser Zone weitergeleitet werden sollen. In jeder Zone müssen alle Kontexte vertreten sein.
Audio-Routing konfigurieren
Die Audiorichtliniendateien, die sich in der Regel in der Anbieterpartition befinden, stellen die Audiohardwarekonfiguration des Boards dar. Alle in car_audio_configuration.xml
referenzierten Geräte müssen in audio_policy_configuration.xml
definiert sein.
AAOS-Routing aktivieren
Wenn Sie AAOS-basiertes Routing verwenden möchten, müssen Sie das Flag audioUseDynamicRouting
auf true
setzen:
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
Bei false
werden das Routing und ein Großteil von CarAudioService
deaktiviert und das Betriebssystem greift auf das Standardverhalten der AudioService
zurück.
Primäre Zone
Standardmäßig wird der gesamte Audioinhalt an die primäre Zone weitergeleitet. Es kann nur eine primäre Zone geben, die in der Konfiguration durch das Attribut isPrimary="true"
angegeben wird.
Beispielkonfiguration
Ein Fahrzeug kann beispielsweise zwei Zonen haben: eine primäre Zone und ein Entertainmentsystem für die Rücksitzbank. Damit würde eine mögliche car_audio_configuration.xml
so 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 Kontexte für verschiedene Geräte getrennt. So kann die HAL mithilfe der Fahrzeughardware verschiedene Nachbearbeitungseffekte und Mischungen auf jede Geräteausgabe anwenden. Die Geräte wurden in vier Lautstärkegruppen unterteilt: Medien, Navigation, Anrufe und Wecker. Wenn das System auf useFixedVolume
konfiguriert ist, werden die Lautstärkepegel für jede Gruppe an die HAL übergeben, um sie auf die Ausgabe dieser Geräte anzuwenden.
Für die sekundäre Zone wird die Ausgabe über ein einzelnes Ausgabegerät erwartet. In diesem Beispiel werden alle Verwendungen zur Vereinfachung an das einzelne Gerät und die Volume-Gruppe weitergeleitet.
Audiokonfiguration für die Belegungszone
In Android 11 wurde car_audio_configuration.xml
um zwei neue Felder erweitert: audioZoneId
und occupantZoneId
.
Mit der ersten, audioZoneId
, können Sie die Zonenverwaltung besser steuern.
Mit occupantZoneId
können Sie hingegen ein User-ID-basiertes Routing konfigurieren.
Für die Verwendung dieser neuen Felder ist Version 2 der car_audio_configuration.xml
erforderlich. Wenn wir die obige Audiokonfiguration noch einmal betrachten, aber das neue Feld für die Zuordnung der Belegungsbereichs-ID und der Audiozonen-ID verwenden, kann die neue Konfiguration ohne die Definitionen der Lautstärkegruppe so 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>
In der obigen Konfiguration wird eine Zuordnung für die primäre Zone zu „Bewohnerzone 0“ und audioZoneId
1 zu occupantZoneId
1 definiert. Im Allgemeinen kann jede Zuordnung zwischen Belegungsbereich und Audiozone konfiguriert werden, die Zuordnung muss jedoch eins-zu-eins erfolgen.
Hier sind die Regeln, mit denen die beiden neuen Felder definiert wurden:
- Der Wert für
audioZoneId
der primären Zone ist immer null. - Die Zahlen
audioZoneId
undoccupantZoneId
dürfen sich nicht wiederholen. audioZoneId
undoccupantZoneId
können nur eine Eins-zu-Eins-Zuordnung haben
Routing über eine Anwendungs-UID
In 10 wurden eine Reihe versteckter APIs in CarAudioManager
eingeführt, mit denen Apps Audiozonen und den Fokus abfragen und festlegen können.
int[] getAudioZoneIds(); int getZoneIdForUid(int uid); boolean setZoneIdForUid(int zoneId, int uid); boolean clearZoneIdForUid(int uid);
Mit den oben genannten APIs konnte eine eigene Anwendung das Audio-Routing basierend auf der UID einer Anwendung verwalten. Daher sind auch die Audiozonen-ID und die UID der Anwendung erforderlich. Anhand dieser Informationen kann das Audio-Routing mit der CarAudioManager#setZoneIdForUid
API festgelegt werden.
Zonen für eine App ändern
Standardmäßig wird der gesamte Audiocontent an die primäre Zone weitergeleitet. Wenn Sie eine Anwendung so aktualisieren möchten, dass sie an eine andere Zone weitergeleitet wird, 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 können Zonen nicht dynamisch gewechselt werden. Daher muss die Wiedergabe angehalten und der Fokus neu angefordert werden, um die Zonen zu ändern.
Routing mit User-ID
Das UID-basierte Routing einer Anwendung ermöglicht zwar eine detaillierte Steuerung des Audioroutings jeder Anwendung, erfordert aber auch, dass das Audiorouting für jede Anwendung definiert wird, bevor die Anwendung den Audiofokus anfordert und Audio abspielt. Um dieses Problem zu beheben und die Wiedergabe von Audioinhalten durch Drittanbieter-Apps zu vereinfachen, verwendet CarAudioService
die Zuordnung der Zonen für Fahrzeuginsassen und Audiozonen, um die nutzer-ID-basierte Weiterleitung zu definieren. So wird der Audiodienst des Autos benachrichtigt, wenn sich ein Nutzer in der Belegungszone anmeldet. Mit diesem Signal werden die Audiofokusverwaltung und das Routing automatisch für alle Audiozonen konfiguriert.
UID-basiertes Routing für Anwendungen kann weiterhin verwendet werden, muss aber unabhängig vom Routing der Nutzer-ID erfolgen. Wenn also eine Zuordnung der Zone der Insassen zur Audiozone des Autos definiert ist, wird die UID-basierte Weiterleitung deaktiviert und ein Aufruf von CarAudioManager#setZoneidForUid
führt zu einem Fehler.
Durch die Verwaltung von Belegungszonen wurden die Audioweiterleitung und die Fokusverwaltung zwar vereinfacht, aber der Nutzer muss weiterhin einer Belegungszone zugewiesen werden. Dazu können Sie CarOccupantZoneManager#assignProfileUserToOccupantZone
verwenden. Für diese API ist die Berechtigung zum Verwalten von Nutzern erforderlich. Derzeit wird davon ausgegangen, dass OEMs die Zuweisung von Nutzern zu Belegungszonen über eine Art System-UI verwalten. Danach werden das Starten der Anwendung, die Audioweiterleitung und die Fokusverwaltung automatisch für den Nutzer konfiguriert.
Routing mit setPreferredDevice
Neben den oben genannten Änderungen gibt es in Android 11 auch eine neue API zum Abfragen von Ausgabegeräten, die mit den einzelnen Zonen verknüpft sind: CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage).
Mit der API können Sie ein Ausgabegerät für eine bestimmte Zone und die Verwendung eines Audioattributs abfragen. So können Anwendungen von Erstanbietern Audio mithilfe der setPreferredDevice
API des Players an verschiedene Zonen weiterleiten. Die getOutputDeviceForUsage
API ist eine System-API und erfordert PERMISSION_CAR_CONTROL_AUDIO_SETTINGS
. Unten findest du ein Beispiel dafür, wie du mit der setPreferredDevice
API das Mediengerät für eine bestimmte Zone suchst und eine Weiterleitung zu diesem Gerät erzeugst.
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);