Audioeingabe wird geteilt

Die Audioeingabe erfolgt in der Regel über das integrierte Mikrofon, ein externes Mikrofon oder eine an das Gerät angeschlossene Audio-Schnittstelle. Audioeingaben können auch aus einem Telefonanruf 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 Barrierefreiheitsdienst, 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 Apps 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 aufzeichnete oder abhörte, konnte Ihre App ein AudioRecord-Objekt erstellen, aber beim Aufrufen von AudioRecord.startRecording() wurde ein Fehler zurückgegeben und die Aufzeichnung wurde nicht gestartet.

Eine Ausnahme von dieser Regel war, wenn eine privilegierte App (z. B. Google Assistant oder ein Bedienungshilfendienst) 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 Vordergrund-UI-Komponente mit der Aufnahme begann, wurde die App 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.

Unter Android 10 wird ein Prioritätsschema verwendet, 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 verarbeitet, 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.

Android unterscheidet zwei Arten von Apps für die Audioaufnahme:

  • „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 Benutzeroberflächen im Vordergrund haben eine höhere Priorität als Hintergrund-Apps.
  • Apps, die Audioinhalte aus einer datenschutzrelevanten 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 von ihnen 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 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 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 ermöglicht Funktionen wie die Steuerung eines Sprachanrufs oder einer Videoaufnahme per Sprachbefehl.

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

Zwei normale Apps

Wenn zwei Apps gleichzeitig Audio aufnehmen, 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:

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 Möglichkeit, Audioinhalte gleichzeitig aufzunehmen, unabhängig vom ausgewählten Anwendungsfall aktiviert und deaktiviert werden kann.

Die neuen Methoden sind:

Wenn setPrivacySensitive() true ist, ist der Aufnahmeanwendungsfall 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 einen 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 geändert
  • Vorverarbeitung geändert
  • Stream-Attribute 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 das an den Client zurückgegebene Audio 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-Eigenschaften zurück. Die vom Client empfangenen Audiodaten entsprechen immer dem von getClientFormat() zurückgegebenen erforderlichen Format. 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.