Audioeingabe wird geteilt

Die Audioeingabe erfolgt in der Regel über das integrierte Mikrofon, ein externes Mikrofon oder eine Audioschnittstelle, die an das Gerät angeschlossen ist. Audio-Eingabe kann auch aus einem Telefongespräch stammen.

Manchmal möchten zwei oder mehr Apps dieselbe Audioeingabe „erfassen“. Sie führen möglicherweise unterschiedliche Aufgaben aus. Einige Apps, die Audio empfangen, „nehmen auf“, z. B. ein einfacher Diktiergerät, während andere Apps „zuhören“, z. B. Google Assistant oder eine Bedienungshilfe, die auf Sprachbefehle reagiert.

In beiden Fällen möchten diese Apps Audioeingaben empfangen. Auf dieser Seite verwenden wir den Begriff „erfassen“, unabhängig davon, ob eine App aufnimmt oder nur zuhört.

Wenn zwei oder mehr Apps gleichzeitig Audio erfassen möchten, kann es zu Problemen bei der Übertragung des Audiosignals von derselben Quelle an alle Apps kommen. Auf dieser Seite wird beschrieben, wie das Android-System Audioeingaben zwischen mehreren Apps teilt, die Audio erfassen.

Verhalten vor Android 10

Vor Android 10 konnte der Audioeingabestream nur von einer App gleichzeitig erfasst werden. Wenn eine App bereits Audio aufnahm oder zuhörte, konnte Ihre App ein AudioRecord Objekt erstellen. Beim Aufruf von AudioRecord.startRecording() wurde jedoch ein Fehler zurückgegeben und die Aufnahme wurde 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 konnte eine andere App die Aufnahme starten. Die privilegierte App wurde beendet und die neue App erfasste die Eingabe.

In Android 9 wurde eine weitere Änderung hinzugefügt: Nur Apps, die im Vordergrund ausgeführt werden (oder ein Vordergrunddienst), konnten die Audioeingabe erfassen. Wenn eine App ohne Dienst im Vordergrund oder Vordergrund-UI-Komponente mit der Erfassung begann, wurde sie weiter ausgeführt, empfing aber keine Audioeingabe, auch wenn sie die einzige App war, die zu diesem Zeitpunkt Audio erfasste.

Verhalten unter Android 10

Vor Android 10 galt das Prinzip „Wer zuerst kommt, mahlt zuerst“. Sobald eine App mit der Audioerfassung beginnt, können keine anderen Apps auf die Audioeingabe zugreifen, bis die App, die Audio erfasst, beendet wird.

Android 10 führt ein Prioritätsschema ein, 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 erfassende App in den meisten Fällen weiter ausgeführt, empfängt aber keine Audioeingabe. In einigen Fällen kann das System Audio weiterhin an beide Apps senden. Die verschiedenen Freigabeszenarien werden unten erläutert.

Dieses Schema ähnelt der Art und Weise, wie der Audiofokus mehrere Apps verarbeitet, die um die Verwendung der Audioausgabe konkurrieren. Der Audiofokus wird jedoch durch programmatische Anfragen zum Erhalten und Freigeben des Fokus verwaltet, während das hier beschriebene Schema zum Umschalten der Eingabe auf einer Priorisierungsrichtlinie basiert, die automatisch angewendet wird, wenn eine neue App mit der Audioerfassung beginnt.

Für die Audioerfassung unterscheidet Android 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 Freigabe 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 Audio aus einer datenschutzrelevanten Quelle erfassen, haben eine höhere Priorität als andere Apps.
  • Zwei normale Apps können niemals gleichzeitig Audio erfassen.
  • In einigen Situationen kann eine privilegierte App Audioeingaben für eine andere App freigeben.
  • Wenn zwei Hintergrund-Apps mit derselben Priorität Audio erfassen, hat die zuletzt gestartete App eine höhere Priorität.

Freigabeszenarien

Wenn zwei Apps versuchen, Audio zu erfassen, können beide das Eingangssignal empfangen oder eine von ihnen empfängt keine Audioeingabe.

Es gibt vier Hauptszenarien:

  • Assistant + normale App
  • Bedienungshilfe + normale App
  • Zwei normale Apps
  • Sprachanruf + normale App

Assistant + normale App

Assistant ist eine privilegierte App, da sie vorinstalliert ist und die Rolle RoleManager.ROLE_ASSISTANT hat. Jede andere vorinstallierte App mit dieser Rolle wird ähnlich behandelt.

Android gibt die Audioeingabe gemäß diesen Regeln frei:

  • Assistant kann Audio empfangen (unabhängig davon, ob sie im Vordergrund oder Hintergrund ausgeführt wird), es sei denn, eine andere App, die eine datenschutzrelevante Audioquelle verwendet, erfasst bereits Audio.

  • Die App empfängt Audio, es sei denn, Assistant hat eine sichtbare UI-Komponente oben auf dem Bildschirm.

Beide Apps empfangen nur dann Audio, wenn Assistant im Hintergrund ausgeführt wird und die andere App Audio nicht aus einer datenschutzrelevanten Audioquelle erfasst.

Bedienungshilfe + normale App

Für einen AccessibilityService ist eine strenge Deklaration erforderlich.

Android gibt die Audioeingabe gemäß diesen Regeln frei:

  • Wenn die UI des Dienstes oben angezeigt wird, empfangen sowohl der Dienst als auch die App Audioeingaben. Dieses Verhalten ermöglicht Funktionen wie die Steuerung eines Sprachanrufs oder einer Videoaufnahme mit Sprachbefehlen.

  • Wenn der Dienst nicht oben angezeigt wird, wird dieser Fall wie der unten beschriebene Fall mit zwei normalen Apps behandelt.

Zwei normale Apps

Wenn zwei Apps gleichzeitig Audio erfassen, empfängt nur eine App Audio und die andere keine Audioeingabe.

Android gibt die Audioeingabe gemäß diesen Regeln frei:

  • Wenn keine der Apps datenschutzrelevant ist, empfängt die App mit einer UI oben Audio. Wenn keine der Apps eine UI hat, empfängt die App, die zuletzt mit der Erfassung begonnen hat, Audio.
  • Wenn eine der Apps datenschutzrelevant ist, empfängt sie Audio und die andere App keine Audioeingabe, auch wenn sie eine UI oben hat oder zuletzt mit der Erfassung begonnen hat.
  • Wenn beide Apps datenschutzrelevant sind, empfängt die App, die zuletzt mit der Erfassung begonnen hat, Audio und die andere keine Audioeingabe.

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 die Audioeingabe gemäß diesen Regeln frei:

Verhalten unter Android 11

Android 11 (API-Level 30) verwendet das oben beschriebene Prioritätsschema von Android 10. Außerdem bietet es neue Methoden in AudioRecord, MediaRecorder und AAudioStream, mit denen die Möglichkeit zur gleichzeitigen Audioerfassung unabhängig vom ausgewählten Anwendungsfall aktiviert und deaktiviert werden kann.

Die neuen Methoden sind:

Wenn setPrivacySensitive() auf true gesetzt ist, ist der Anwendungsfall für die Erfassung privat und auch ein privilegierter Assistant kann nicht gleichzeitig Audio erfassen. Diese Einstellung überschreibt das Standardverhalten, das von der Audioquelle abhängt. VOICE_COMMUNICATION ist beispielsweise standardmäßig privat, UNPROCESSED jedoch nicht.

Konfigurationsänderungen

Wenn mehrere Apps gleichzeitig Audio erfassen, sind nur eine oder zwei davon „aktiv“ (empfangen Audio). Die anderen sind stummgeschaltet (empfangen keine Audioeingabe). Wenn sich die aktiven Apps ändern, konfiguriert das Audio-Framework die Audiopfade 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 der aktiven App mit der höchsten Priorität zugeordnet 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 einen AudioManager.AudioRecordingCallback für das AudioRecord oder MediaRecorder Objekt registrieren, um benachrichtigt zu werden, wenn sich die Konfiguration ändert. Mögliche Änderungen sind:

  • Erfassung stummgeschaltet oder Stummschaltung aufgehoben
  • Gerät geändert
  • Vorverarbeitung geändert
  • Stream-Attribute geändert (Abtastrate, Kanalmaske, Abtastformat)

Sie müssen AudioRecord.registerAudioRecordingCallback() aufrufen, bevor die Erfassung gestartet wird. Der Callback wird nur ausgeführt, wenn die App Audio empfängt und eine Änderung auftritt.

Die Methode onRecordingConfigChanged() gibt eine AudioRecordingConfiguration zurück, die den aktuellen Status der Audioerfassung enthält. Mit den folgenden Methoden können Sie mehr über die Änderung erfahren:

isClientSilenced()
Gibt „true“ zurück, wenn die Audioeingabe, die an den Client zurückgegeben wird, aufgrund der Erfassungsrichtlinie derzeit stummgeschaltet ist.
getAudioDevice()
Gibt das aktive Audiogerät zurück.
getEffects()
Gibt den aktiven Vorverarbeitungseffekt zurück. Der aktive Effekt ist möglicherweise nicht derselbe wie die von getClientEffects() zurückgegebenen Effekte, wenn der Client nicht die aktive App mit der höchsten Priorität ist.
getFormat()
Gibt die Stream-Attribute zurück. Die tatsächlichen Audiodaten, die vom Client empfangen werden, entsprechen immer dem erforderlichen Format, das von getClientFormat() zurückgegeben wird. Das Framework führt automatisch die erforderliche Neuabtastung, Kanal- und Formatkonvertierung vom Format, das an der Hardwareschnittstelle verwendet wird, in das vom Client angegebene Format durch.
AudioRecord.getActiveRecordingConfiguration().
Gibt die aktive Aufnahmekonfiguration zurück.

Mit AudioManager.getActiveRecordingConfigurations() können Sie eine allgemeine Übersicht über alle aktiven Aufnahmen auf dem Gerät erhalten.