Audioeingabe wird geteilt

Die Audioeingabe erfolgt normalerweise über das integrierte Mikrofon, ein externes Mikrofon oder eine an das Gerät angeschlossene Audioschnittstelle. Die Audioeingabe kann auch aus einem Telefongespräch stammen.

Manchmal möchten zwei oder mehr Apps die gleiche Audioeingabe erfassen. Sie führen möglicherweise unterschiedliche Aufgaben aus. Einige Apps, die Audio empfangen, können beispielsweise „Aufzeichnung“ sein, wie ein einfacher Sprachrekorder, während andere Apps möglicherweise „hören“, wie Google Assistant oder eine Bedienungshilfe, die auf Sprachbefehle reagiert.

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

Wenn zwei oder mehr Apps gleichzeitig Audio aufnehmen möchten, kann es zu Problemen kommen, wenn das Audiosignal von derselben Quelle an alle Apps übertragen wird. Auf dieser Seite wird beschrieben, wie das Android-System die Audioeingabe zwischen mehreren Apps teilt, die Audiodaten erfassen.

Verhalten vor Android 10

Vor Android 10 konnte der Eingangs-Audiostream nur von jeweils einer App erfasst werden. Wenn eine App bereits Audio aufzeichnet oder abhört, könnte sie ein AudioRecord-Objekt erstellen. Wenn Sie AudioRecord.startRecording() aufrufen und die Aufzeichnung nicht gestartet wird, wird jedoch ein Fehler zurückgegeben.

Eine Ausnahme von dieser Regel trat auf, 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 verwendet hat. In diesem Fall könnte eine andere App mit der Aufzeichnung beginnen. Die privilegierte App wurde dann 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 Dienst im Vordergrund), konnten die Audioeingabe erfassen. Wenn eine App ohne Vordergrunddienst oder UI-Komponente im Vordergrund mit der Erfassung begonnen hat, wurde die App zwar weiter ausgeführt, wurde aber stillgelegt, auch wenn sie zu diesem Zeitpunkt die einzige App war, die Audio aufzeichnete.

Verhalten von Android 10

Vor Android 10 gilt 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 die Audioaufnahme ausführt, beendet wird.

In Android 10 gibt es ein Prioritätsschema, mit dem der Audioeingangsstream zwischen Apps gewechselt werden kann, während diese ausgeführt werden. Wenn eine neue App die Audioeingabe abruft, wird die vorherige Aufnahme-App in den meisten Fällen weiter ausgeführt, erhält aber Stille. In einigen Fällen kann das System weiterhin Audiodaten 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 Audioausgabe konkurrieren. Der Audiofokus wird jedoch von programmatischen Anfragen verwaltet, um den Fokus zu gewinnen und freizugeben. Das hier beschriebene Schema zum Wechseln der Eingabe basiert hingegen auf einer Priorisierungsrichtlinie, die automatisch angewendet wird, wenn eine neue App mit der Audioaufnahme beginnt.

Bei der Audioaufnahme wird bei Android zwischen zwei Arten von Apps unterschieden:

  • Gewöhnliche Apps werden vom Nutzer installiert.
  • Privilegierte Apps sind auf dem Gerät vorinstalliert. Dazu gehören Google Assistant und alle Bedienungshilfen.

Darüber hinaus wird eine App anders behandelt, wenn sie eine Audioquelle verwendet, bei der der Datenschutz berücksichtigt wird: CAMCORDER oder VOICE_COMMUNICATION.

Für die Nutzung und Freigabe von Audioeingaben gelten Priorisierungsregeln:

  • Privilegierte Apps haben eine höhere Priorität als gewöhnliche Apps.
  • Apps mit sichtbaren UI-Benutzeroberflächen im Vordergrund haben eine höhere Priorität als Apps im Hintergrund.
  • Apps, die Audioaufnahmen von einer datenschutzkonformen Quelle erfassen, haben eine höhere Priorität als Apps, die dies nicht tun.
  • Zwei gewöhnliche Apps können niemals Audio gleichzeitig aufnehmen.
  • In einigen Fällen kann eine privilegierte App Audioeingaben mit einer anderen App teilen.
  • Wenn zwei Hintergrund-Apps mit derselben Priorität Audio aufzeichnen, hat die zuletzt gestartete App eine höhere Priorität.

Freigabeszenarien

Wenn zwei Apps versuchen, Audio aufzunehmen, können sie möglicherweise beide das Eingabesignal empfangen oder eine von ihnen kann stummgeschaltet werden.

Es gibt vier Hauptszenarien:

  • Assistant- und gewöhnliche App
  • Bedienungshilfe + gewöhnliche App
  • Zwei gewöhnliche Apps
  • Sprachanruf + normale App

Assistant- und gewöhnliche App

Assistant ist eine privilegierte Anwendung, da er vorinstalliert ist und die Rolle RoleManager.ROLE_ASSISTANT hat. Alle anderen vorinstallierten Apps mit dieser Rolle werden ähnlich behandelt.

Android gibt die Audioeingabe nach den folgenden Regeln weiter:

  • Assistant kann Audiodaten empfangen, unabhängig davon, ob diese im Vordergrund oder im Hintergrund ausgeführt werden, es sei denn, eine andere App verwendet bereits eine datenschutzkonforme Audioquelle.

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

Beide Apps empfangen Audio nur dann, wenn Assistant im Hintergrund ausgeführt wird und die andere App keine Audiodaten von einer datenschutzkonformen Audioquelle aufnimmt.

Bedienungshilfe + gewöhnliche App

Eine AccessibilityService erfordert eine strenge Deklaration.

Android gibt die Audioeingabe nach den folgenden Regeln weiter:

  • Wenn sich die UI des Dienstes oben befindet, empfangen sowohl der Dienst als auch die App Audioeingaben. Dieses Verhalten bietet Funktionen wie die Steuerung von Sprachanrufen oder Videoaufnahmen per Sprachbefehl.

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

Zwei gewöhnliche Apps

Wenn zwei Apps gleichzeitig Daten aufzeichnen, empfängt nur eine App Audio und die andere wird stummgeschaltet.

Android gibt die Audioeingabe nach den folgenden Regeln weiter:

  • Wenn keine der beiden Apps datenschutzfreundlich ist, empfängt die App mit einer UI oben Audio. Wenn keine der beiden Apps eine Benutzeroberfläche hat, empfängt die App, die mit der Aufnahme der neuesten App begonnen hat, Audio.
  • Wenn eine der Apps datenschutzfreundlich ist, empfängt sie Audio und die andere App wird stummgeschaltet, auch wenn sie eine UI hat oder erst vor Kurzem mit der Aufnahme begonnen hat.
  • Wenn beide Apps datenschutzfreundlich sind, empfängt die App, die kürzlich mit der Aufnahme begonnen hat, den Ton, die andere App ist stummgeschaltet.

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 nach den folgenden Regeln weiter:

Verhalten von Android 11

Android 11 (API-Level 30) berücksichtigt das oben beschriebene Prioritätsschema von Android 10. Außerdem bietet es neue Methoden in AudioRecord, MediaRecorder und AAudioStream, die die gleichzeitige Audioaufnahme aktivieren und deaktivieren – unabhängig vom ausgewählten Anwendungsfall.

Die neuen Methoden sind:

Wenn setPrivacySensitive() den Wert true hat, ist der Anwendungsfall für die Erfassung privat und selbst ein privilegierter Assistant kann nicht gleichzeitig Aufnahmen machen. Diese Einstellung überschreibt das Standardverhalten, das von der Audioquelle abhängt. Beispielsweise ist VOICE_COMMUNICATION standardmäßig privat, UNPROCESSED jedoch nicht.

Konfigurationsänderungen

Wenn mehrere Apps gleichzeitig Audio aufnehmen, ist nur eine oder zwei "aktiv" (Empfangen von Audio). Die anderen Apps sind stummgeschaltet (mit Stille). Wenn sich die aktiven Anwendungen ändern, konfiguriert das Audio-Framework die Audiopfade möglicherweise gemäß den folgenden 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 Anwendung mit der höchsten Priorität zugeordnet ist, ist aktiviert. Alle anderen Vorverarbeitungen werden ignoriert.

Da eine aktive App möglicherweise stummgeschaltet wird, wenn eine App mit höherer Priorität aktiv wird, können Sie ein AudioManager.AudioRecordingCallback auf dem AudioRecord- oder MediaRecorder-Objekt registrieren, damit es bei Änderungen der Konfiguration benachrichtigt wird. Mögliche Änderungen:

  • Stummgeschaltet oder ohne Stummschaltung aufnehmen
  • Gerät geändert
  • Vorverarbeitung geändert
  • Stream-Eigenschaften geändert (Stichprobenrate, Kanalmaske, Beispielformat)

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 erfolgt.

Die Methode onRecordingConfigChanged() gibt ein AudioRecordingConfiguration-Objekt zurück, das den aktuellen Status der Audioaufnahme enthält. Verwenden Sie die folgenden Methoden, um mehr über die Änderung zu erfahren:

isClientSilenced()
Gibt „true“ zurück, wenn die an den Client zurückgegebenen Audiodaten derzeit aufgrund der Aufnahmerichtlinie stummgeschaltet werden.
getAudioDevice()
Gibt das aktive Audiogerät zurück.
getEffects()
Gibt den aktiven Vorverarbeitungseffekt zurück. Wenn der Client nicht die aktive App mit der höchsten Priorität ist, entspricht der aktive Effekt möglicherweise nicht dem von getClientEffects() zurückgegebenen Effekt.
getFormat()
Gibt die Streameigenschaften 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 das erforderliche Resampling sowie die Kanal- und Formatkonvertierung vom an der Hardwareschnittstelle verwendeten Format in das vom Client angegebene Format durch.
AudioRecord.getActiveRecordingConfiguration().
Gibt die Konfiguration für die aktive Aufzeichnung zurück.

Wenn Sie AudioManager.getActiveRecordingConfigurations() aufrufen, können Sie sich einen allgemeinen Überblick über alle aktiven Aufnahmen auf dem Gerät verschaffen.