Audioeingabe wird geteilt

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 Telefongespräch stammen.

Es kann vorkommen, dass zwei oder mehr Apps dieselbe Audioeingabe erfassen möchten. Möglicherweise führen sie unterschiedliche Aufgaben aus. Einige Apps, die Audio empfangen, können beispielsweise „aufnehmen“ sein, wie ein einfacher Sprachrekorder, während andere Apps „zuhören“ sind, wie Google Assistant oder eine Bedienungshilfe, die auf Sprachbefehle reagiert.

In beiden Fällen möchten diese Apps Audioeingaben empfangen. Auf dieser Seite wird der Begriff „Capture“ verwendet, unabhängig davon, ob eine App Daten aufzeichnet oder nur abhört.

Wenn zwei oder mehr Apps gleichzeitig Audio erfassen möchten, kann es ein Problem bei der Übermittlung des Audiosignals aus derselben Quelle an alle Apps geben. Auf dieser Seite wird beschrieben, wie das Android-System die Audioeingabe zwischen mehreren Apps teilt, die Audio erfassen.

Verhalten vor Android 10

Vor Android 10 konnte der Audioeingabestream jeweils nur von einer App aufgenommen werden. Wenn eine App bereits Audio aufzeichnet oder zuhört, könnte sie ein AudioRecord-Objekt erstellen. Beim Aufruf von AudioRecord.startRecording() wird jedoch ein Fehler zurückgegeben und die Aufzeichnung wird nicht gestartet.

Eine Ausnahme von dieser Regel war, wenn eine privilegierte App wie Google Assistant oder ein Bedienungshilfendienst 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. In diesem Fall wurde die privilegierte Anwendung beendet und die neue Anwendung hat die Eingabe erfasst.

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 einen Dienst im Vordergrund oder ohne UI-Komponente im Vordergrund mit der Erfassung begonnen hat, wurde die App zwar weiter ausgeführt, wurde jedoch stummgeschaltet, auch wenn es zu diesem Zeitpunkt die einzige App war, die Audio über die App aufzeichnet.

Verhalten von Android 10

Vor Android 10 wurde der Dienst in der Reihenfolge der eingehenden Anfragen verwendet. Sobald eine App mit der Audioaufnahme beginnt, können keine anderen Apps mehr auf die Audioeingabe zugreifen, bis die App, die die Audioaufnahme durchführt, beendet wird.

Unter Android 10 gibt es ein Prioritätsschema, das den Audioeingabestream während der Ausführung zwischen Apps wechseln kann. Wenn eine neue App die Audioeingabe übernimmt, wird die zuvor erfasste App in den meisten Fällen zwar weiter ausgeführt, ist aber lautlos. 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 Anwendungen handhabt, die um die Verwendung der Audioausgabe konkurrieren. Der Audiofokus wird jedoch durch programmatische Anfragen verwaltet, um den Fokus zu verstärken und freizugeben. Das hier beschriebene Schema zum Wechseln der Eingabe basiert auf einer Priorisierungsrichtlinie, die automatisch angewendet wird, wenn eine neue App beginnt, Audio zu erfassen.

Für die Audioaufzeichnung 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.

Darüber hinaus wird eine App anders behandelt, wenn sie eine datenschutzkonforme Audioquelle verwendet: CAMCORDER oder VOICE_COMMUNICATION.

Für die Verwendung und Freigabe der Audioeingabe gelten folgende Priorisierungsregeln:

  • Privilegierte Apps haben eine höhere Priorität als normale Apps.
  • Apps mit sichtbaren Oberflächen im Vordergrund haben eine höhere Priorität als Hintergrund-Apps.
  • Apps, die Audio aus einer datenschutzkonformen Quelle aufnehmen, haben eine höhere Priorität als Apps, bei denen dies nicht der Fall ist.
  • Zwei normale Apps können niemals gleichzeitig Audio aufnehmen.
  • In einigen Situationen kann eine privilegierte App die Audioeingabe 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 beide das Eingabesignal empfangen oder eine der Apps ist stummgeschaltet.

Es gibt vier Hauptszenarien:

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

Assistant + normale App

Assistant ist eine privilegierte App, weil sie vorinstalliert ist und die Rolle RoleManager.ROLE_ASSISTANT hat. Alle anderen vorinstallierten Apps mit dieser Rolle werden ähnlich behandelt.

Android teilt die Audioeingabe gemäß den folgenden Regeln:

  • Assistant kann Audioinhalte unabhängig davon empfangen, ob die Inhalte im Vorder- oder Hintergrund ausgeführt werden, es sei denn, eine andere App, die eine datenschutzkonforme Audioquelle nutzt, nimmt bereits die Daten auf.

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

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

Bedienungshilfe + normale App

Ein AccessibilityService erfordert eine strikte Deklaration.

Android teilt die Audioeingabe gemäß den folgenden Regeln:

  • Wenn sich die UI des Dienstes oben befindet, empfangen sowohl der Dienst als auch die Anwendung Audioeingaben. Dieses Verhalten bietet Funktionen wie die Steuerung eines Sprachanrufs oder einer Videoaufnahme mit Sprachbefehlen.

  • Wenn der Dienst nicht im Vordergrund steht, wird dieser Fall wie der normale Fall unten behandelt.

Zwei normale Apps

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

Android teilt die Audioeingabe gemäß den folgenden Regeln:

  • Wenn keine der beiden Apps datenschutzkonform ist, empfängt die App mit einer UI oben Audio. Wenn keine der beiden Apps über eine UI verfügt, empfängt diejenige, mit der die Aufnahme der letzten Aufnahme begonnen hat, Audio.
  • Wenn eine der Apps datenschutzfreundlich ist, empfängt sie Audio und die andere App wird stummgeschaltet, auch wenn sie oben eine Benutzeroberfläche hat oder erst seit Kurzem mit der Aufnahme begonnen hat.
  • Wenn beide Apps datenschutzkonform sind, empfängt die App, die zuletzt mit der Aufzeichnung begonnen hat, Audio und die andere wird 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 teilt die Audioeingabe gemäß den folgenden Regeln:

Verhalten von Android 11

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

Die neuen Methoden sind:

Wenn setPrivacySensitive() den Wert true hat, ist der Anwendungsfall privat und selbst ein privilegierter Assistant kann nicht gleichzeitig aufnehmen. 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 aufzeichnen, sind nur eine oder zwei Apps "aktiv" (sie empfangen Audio). Die anderen sind stummgeschaltet, d. h., sie werden stumm geschaltet. Wenn sich die aktiven Anwendungen ändern, konfiguriert das Audio-Framework die Audiopfade gemäß den folgenden Regeln neu:

  • Das Audioeingabegerät kann sich für jede aktive App ändern (z. B. vom integrierten Mikrofon zu einem angeschlossenen Bluetooth-Headset).
  • Die Vorverarbeitung der aktiven Anwendung mit der höchsten Priorität wird aktiviert. Alle anderen Vorverarbeitungen werden ignoriert.

Da eine aktive Anwendung stummgeschaltet werden kann, wenn eine Anwendung mit höherer Priorität aktiviert wird, können Sie einen AudioManager.AudioRecordingCallback für das Objekt AudioRecord oder MediaRecorder registrieren, um bei Änderungen der Konfiguration benachrichtigt zu werden. Mögliche Änderungen:

  • Aufnahme stummgeschaltet oder stummgeschaltet
  • 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 auftritt.

Die Methode onRecordingConfigChanged() gibt ein AudioRecordingConfiguration-Objekt zurück, das den aktuellen Audioaufnahmestatus enthält. Mit den folgenden Methoden können Sie mehr über die Änderung erfahren:

isClientSilenced()
Gibt „true“ zurück, wenn das an den Client zurückgegebene Audio derzeit aufgrund der Erfassungsrichtlinie stummgeschaltet ist.
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 von getClientFormat() zurückgegebenen Format. Das Framework führt automatisch die erforderlichen Resampling-, Kanal- und Formatkonvertierungen vom an der Hardwareschnittstelle verwendeten Format in das vom Client angegebene Format durch.
AudioRecord.getActiveRecordingConfiguration().
Gibt die aktive Aufzeichnungskonfiguration zurück.

Durch Aufrufen von AudioManager.getActiveRecordingConfigurations() können Sie sich einen Überblick über alle aktiven Aufzeichnungen auf dem Gerät verschaffen.