Die Audioeingabe erfolgt in der Regel über das integrierte Mikrofon, ein externes Mikrofon oder eine an das Gerät angeschlossene Audioschnittstelle. Die Audioeingabe kann auch aus einem Telefonat stammen.
Manchmal möchten zwei oder mehr Apps dieselbe Audioeingabe „erfassen“. Sie führen möglicherweise unterschiedliche Aufgaben aus. Einige Apps, die Audio empfangen, können beispielsweise „aufzeichnen“, wie ein einfaches Sprachaufzeichnungstool, während andere Apps „zuhören“, wie Google Assistant oder ein Bedienungshilfendienst, der auf Sprachbefehle reagiert.
In beiden Fällen möchten diese Apps Audioeingaben empfangen. Auf dieser Seite verwenden wir den Begriff „Aufnahme“ unabhängig davon, ob eine App aufzeichnet oder nur zuhört.
Wenn zwei oder mehr Apps gleichzeitig Audio aufnehmen möchten, kann es zu Problemen bei der Übertragung des Audiosignals von derselben Quelle an alle kommen. Auf dieser Seite wird beschrieben, wie das Android-System Audioeingaben zwischen mehreren Apps teilt, die Audio aufnehmen.
Verhalten vor Android 10
Vor Android 10 konnte der Audio-Eingabestream jeweils nur von einer App erfasst werden. Wenn eine andere App bereits Audio aufzeichnet oder abhört, kann Ihre App zwar ein AudioRecord-Objekt erstellen, aber beim Aufrufen von AudioRecord.startRecording() wird ein Fehler zurückgegeben und die Aufnahme wird nicht gestartet.
Eine Ausnahme von dieser Regel war, wenn eine privilegierte App (z. B. Google Assistant oder eine Bedienungshilfe) die Berechtigung android.permission.CAPTURE_AUDIO_HOTWORD hatte und eine Audioquelle vom Typ HOTWORD verwendete. In diesem Fall könnte eine andere App mit der Aufzeichnung beginnen. In diesem Fall wurde die privilegierte App beendet und die neue App hat die Eingabe erfasst.
In Android 9 wurde eine weitere Änderung eingeführt: Nur Apps, die im Vordergrund ausgeführt werden (oder ein Dienst im Vordergrund), können die Audioeingabe erfassen. Wenn eine App ohne Vordergrunddienst oder UI-Komponente im Vordergrund mit der Aufnahme begann, wurde sie zwar weiter ausgeführt, es wurde aber Stille aufgezeichnet, auch wenn sie die einzige App war, die zu diesem Zeitpunkt Audio aufnahm.
Verhalten unter Android 10
Vor Android 10 galt das Prinzip „Wer zuerst kommt, mahlt zuerst“. Sobald eine App mit der Audioaufnahme beginnt, können keine anderen Apps auf die Audioeingabe zugreifen, bis die App, die Audio aufnimmt, beendet wird.
In Android 10 wird ein Prioritätsschema eingeführt, mit dem der Audioeingabestream zwischen Apps umgeschaltet werden kann, während sie ausgeführt werden. Wenn eine neue App die Audioeingabe übernimmt, wird die zuvor aufzeichnende App in den meisten Fällen weiter ausgeführt, empfängt aber keine Audiosignale mehr. In einigen Fällen kann das System weiterhin Audio an beide Apps senden. Die verschiedenen Freigabeszenarien werden unten erläutert.
Dieses Schema ähnelt der Art und Weise, wie der Audiofokus mehrere Apps behandelt, die um die Verwendung der Audioausgabe konkurrieren. Der Audiofokus wird jedoch durch programmatische Anfragen zum Erhalten und Freigeben des Fokus verwaltet. Das hier beschriebene Schema zum Umschalten der Eingabe basiert auf einer Priorisierungsrichtlinie, die automatisch angewendet wird, wenn eine neue App mit der Audioaufnahme beginnt.
Für die Audioaufnahme unterscheidet Android zwischen zwei Arten von Apps:
- „Normale“ Apps werden vom Nutzer installiert.
- „Privilegierte“ Apps sind auf dem Gerät vorinstalliert. Dazu gehören Google Assistant und alle Bedienungshilfen.
Außerdem wird eine App anders behandelt, wenn sie eine datenschutzrelevante Audioquelle verwendet: CAMCORDER oder VOICE_COMMUNICATION.
Die Priorisierungsregeln für die Verwendung und Weitergabe von Audioeingaben sind wie folgt:
- Privilegierte Apps haben eine höhere Priorität als normale Apps.
- Apps mit sichtbaren Vordergrund-UIs haben eine höhere Priorität als Hintergrund-Apps.
- Apps, die Audioinhalte aus einer datenschutzsensiblen Quelle aufzeichnen, haben eine höhere Priorität als andere Apps.
- Zwei normale Apps können niemals gleichzeitig Audio aufnehmen.
- In einigen Situationen kann eine privilegierte App Audioeingaben mit einer anderen App teilen.
- Wenn zwei Hintergrund-Apps mit derselben Priorität Audio aufnehmen, hat die zuletzt gestartete App eine höhere Priorität.
Freigabeszenarien
Wenn zwei Apps versuchen, Audio aufzunehmen, können beide das Eingangssignal empfangen oder eine der beiden empfängt Stille.
Es gibt vier Hauptszenarien:
- Assistant-App + normale App
- Bedienungshilfe + normale App
- Zwei normale Apps
- Sprachanruf + normale App
Assistant-App + normale App
Der Assistant ist eine privilegierte App, da er vorinstalliert ist und die Rolle RoleManager.ROLE_ASSISTANT hat. Alle anderen vorinstallierten Apps mit dieser Rolle werden ähnlich behandelt.
Android gibt das eingegebene Audio gemäß diesen Regeln weiter:
Assistant kann Audio empfangen, unabhängig davon, ob die App im Vordergrund oder Hintergrund ausgeführt wird, es sei denn, eine andere App, die eine datenschutzrelevante Audioquelle verwendet, nimmt bereits Audio auf.
Die App empfängt Audio, sofern der Assistant keine sichtbare UI-Komponente oben auf dem Bildschirm hat.
Beachte, dass beide Apps nur dann Audio empfangen, wenn der Assistant im Hintergrund ausgeführt wird und die andere App keine Audioinhalte von einer datenschutzrelevanten Audioquelle aufnimmt.
Bedienungshilfe + normale App
Für ein AccessibilityService ist eine strikte Deklaration erforderlich.
Android gibt das eingegebene Audio gemäß diesen Regeln weiter:
Wenn die Benutzeroberfläche des Dienstes oben angezeigt wird, erhalten sowohl der Dienst als auch die App Audioeingaben. Dieses Verhalten bietet Funktionen wie das Steuern eines Sprachanrufs oder einer Videoaufnahme mit Sprachbefehlen.
Wenn der Dienst nicht oben steht, wird dieser Fall wie der normale Fall mit zwei Apps unten behandelt.
Zwei normale Apps
Wenn zwei Apps gleichzeitig aufzeichnen, erhält nur eine App Audio und die andere Stille.
Android gibt das eingegebene Audio gemäß diesen Regeln weiter:
- Wenn keine der beiden Apps datenschutzrelevant ist, empfängt die App mit einer Benutzeroberfläche im Vordergrund Audio. Wenn keine der beiden Apps eine Benutzeroberfläche hat, empfängt die App, die die Aufnahme zuletzt gestartet hat, Audio.
- Wenn eine der Apps datenschutzsensibel ist, empfängt sie Audio und die andere App Stille, auch wenn sie eine Benutzeroberfläche im Vordergrund hat oder erst vor Kurzem mit der Aufnahme begonnen hat.
- Wenn beide Apps datenschutzsensibel sind, erhält die App, die zuletzt mit der Aufnahme begonnen hat, Audio und die andere Stille.
Sprachanruf + normale App
Ein Sprachanruf ist aktiv, wenn der von AudioManager.getMode() zurückgegebene Audiomodus MODE_IN_CALL oder MODE_IN_COMMUNICATION ist.
Android gibt das eingegebene Audio gemäß diesen Regeln weiter:
- Der Anruf empfängt immer Audio.
- Die App kann Audio aufnehmen, wenn es sich um eine Bedienungshilfe handelt.
Die App kann den Sprachanruf aufzeichnen, wenn es sich um eine privilegierte (vorinstallierte) App mit der Berechtigung
CAPTURE_AUDIO_OUTPUThandelt.Wenn der Uplink (TX), Downlink (RX) oder beides eines Sprachanrufs aufgezeichnet werden soll, muss in der App die Audioquelle
MediaRecorder.AudioSource.VOICE_UPLINKoderMediaRecorder.AudioSource.VOICE_DOWNLINKund/oder das GerätAudioDeviceInfo.TYPE_TELEPHONYangegeben werden.
Verhalten unter Android 11
Unter Android 11 (API‑Level 30) wird das oben beschriebene Prioritätsschema von Android 10 verwendet. Außerdem werden neue Methoden in AudioRecord, MediaRecorder und AAudioStream bereitgestellt, mit denen die gleichzeitige Audioaufnahme unabhängig vom ausgewählten Anwendungsfall aktiviert und deaktiviert werden kann.
Die neuen Methoden sind:
AudioRecord.Builder.setPrivacySensitive()AudioRecord.isPrivacySensitive()MediaRecorder.setPrivacySensitive()MediaRecorder.isPrivacySensitive()AAudioStreamBuilder_setPrivacySensitive()AAudioStream_isPrivacySensitive()
Wenn setPrivacySensitive() gleich true ist, ist der Anwendungsfall für die Aufnahme privat und auch ein privilegierter Assistant kann nicht gleichzeitig aufnehmen. Diese Einstellung überschreibt das Standardverhalten, das von der Audioquelle abhängt. Beispiel: VOICE_COMMUNICATION ist standardmäßig privat, UNPROCESSED jedoch nicht.
Konfigurationsänderungen
Wenn mehrere Apps gleichzeitig Audio aufnehmen, sind nur ein oder zwei davon „aktiv“ (empfangen Audio). Die anderen sind stummgeschaltet (empfangen Stille). Wenn sich die aktiven Apps ändern, konfiguriert das Audio-Framework die Audiopfade möglicherweise gemäß diesen Regeln neu:
- Das Audioeingabegerät für jede aktive App kann sich ändern, z. B. vom integrierten Mikrofon zu einem angeschlossenen Bluetooth-Headset.
- Die Vorverarbeitung, die mit der aktiven App mit der höchsten Priorität verknüpft ist, wird aktiviert. Alle anderen Vorverarbeitungen werden ignoriert.
Da eine aktive App stummgeschaltet werden kann, wenn eine App mit höherer Priorität aktiv wird, können Sie ein AudioManager.AudioRecordingCallback für das AudioRecord- oder MediaRecorder-Objekt registrieren, um benachrichtigt zu werden, wenn sich die Konfiguration ändert. Mögliche Änderungen:
- Aufnahme stummgeschaltet oder nicht stummgeschaltet
- Gerät gewechselt
- Vorverarbeitung geändert
- Stream-Eigenschaften wurden geändert (Abtastrate, Channel-Maske, Sample-Format)
Sie müssen AudioRecord.registerAudioRecordingCallback() aufrufen, bevor die Aufnahme gestartet wird. Der Callback wird nur ausgeführt, wenn die App Audio empfängt und eine Änderung auftritt.
Die Methode onRecordingConfigChanged() gibt ein AudioRecordingConfiguration mit dem aktuellen Status der Audioaufnahme zurück.
Mit den folgenden Methoden können Sie sich über die Änderung informieren:
isClientSilenced()- Gibt „true“ zurück, wenn die an den Client zurückgegebene Audioausgabe aufgrund der Erfassungsrichtlinie stummgeschaltet wird.
getAudioDevice()- Gibt das aktive Audiogerät zurück.
getEffects()- Gibt den aktiven Vorverarbeitungseffekt zurück. Der aktive Effekt ist möglicherweise nicht derselbe wie der von
getClientEffects()zurückgegebene, wenn der Client nicht die aktive App mit der höchsten Priorität ist. getFormat()- Gibt die Stream-Properties zurück. Die tatsächlichen Audiodaten, die der Client empfängt, entsprechen immer dem erforderlichen Format, das von
getClientFormat()zurückgegeben wird. Das Framework führt automatisch das erforderliche Resampling, die Kanal- und Formatkonvertierung vom Format der Hardwareschnittstelle in das vom Client angegebene Format durch. AudioRecord.getActiveRecordingConfiguration()- Gibt die aktive Aufzeichnungskonfiguration zurück.
Sie können sich einen allgemeinen Überblick über alle aktiven Aufnahmen auf dem Gerät verschaffen, indem Sie AudioManager.getActiveRecordingConfigurations() aufrufen.