Audioeingabe wird geteilt

Die Audioeingabe erfolgt in der Regel über das integrierte Mikrofon, ein externes Mikrofon oder eine Audioschnittstelle, die mit dem Gerät verbunden ist. Audioeingaben können auch aus einem Telefongespräch stammen.

Manchmal möchten zwei oder mehr Apps denselben Audioeingang „aufnehmen“. Möglicherweise führen sie unterschiedliche Aufgaben aus. Beispielsweise können einige Apps, die Audio empfangen, „aufzeichnen“, wie ein einfacher Audiorekorder, während andere Apps „zuhören“, wie Google Assistant oder ein Bedienungshilfe-Dienst, 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 die Audioeingabe zwischen mehreren Apps aufteilt, die Audio aufnehmen.

Verhalten vor Android 10

Vor Android 10 konnte der Audioeingabestream nur von einer App gleichzeitig erfasst werden. Wenn eine andere App bereits Audio aufgenommen oder angehört hat, konnte deine App ein AudioRecord-Objekt erstellen, aber beim Aufrufen von AudioRecord.startRecording() wurde ein Fehler zurückgegeben und die Aufnahme wurde nicht gestartet.

Eine Ausnahme von dieser Regel war, wenn eine privilegierte App (wie Google Assistant oder ein Bedienungshilfe-Dienst) die Berechtigung android.permission.CAPTURE_AUDIO_HOTWORD hatte und eine Audioquelle vom Typ HOTWORD verwendete. In diesem Fall könnte eine andere App die Aufnahme starten. In diesem Fall wurde die privilegierte App beendet und die neue App 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), können die Audioeingabe erfassen. Wenn eine App ohne Dienst im Vordergrund oder UI-Komponente im Vordergrund mit der Aufnahme begann, wurde die App weiter ausgeführt, aber es wurde kein Ton aufgenommen, auch wenn sie zu diesem Zeitpunkt die einzige App war, die Audio aufnahm.

Verhalten von 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 den Audioeingang zugreifen, bis die App, die Audio aufnimmt, beendet wird.

Android 10 erzwingt ein Prioritätsschema, mit dem der Eingabe-Audiostream zwischen Apps gewechselt werden kann, während sie ausgeführt werden. Wenn eine neue App die Audioeingabe übernimmt, wird die zuvor aufnehmende App in den meisten Fällen weiter ausgeführt, empfängt aber keine Audiodaten. 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 Nutzung der Audioausgabe konkurrieren. Der Audiofokus wird jedoch durch programmatische Anfragen zum Erhalten und Freigeben des Fokus verwaltet, während das hier beschriebene Schema für den Eingabewechsel auf einer Priorisierungsrichtlinie basiert, die automatisch angewendet wird, wenn eine neue App mit der Audioaufnahme beginnt.

Android unterscheidet zwei Arten von Apps, die Audio aufnehmen:

  • „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.

Für die Verwendung und Freigabe von Audioeingaben gelten die folgenden Priorisierungsregeln:

  • Privilegierte Apps haben eine höhere Priorität als gewöhnliche Apps.
  • Apps mit sichtbaren Benutzeroberflächen im Vordergrund haben eine höhere Priorität als Hintergrund-Apps.
  • Apps, die Audio von einer datenschutzrelevanten Quelle aufnehmen, haben eine höhere Priorität als Apps, die dies nicht tun.
  • Zwei normale Apps können niemals gleichzeitig Audio aufnehmen.
  • In einigen Fällen kann eine privilegierte App die Audioeingabe 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 + normale App
  • Bedienungshilfe + normale App
  • Zwei gewöhnliche Apps
  • Sprachanruf + normale App

Assistant + normale App

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

Android gibt die Audioeingabe gemäß den folgenden Regeln weiter:

  • Assistant kann Audio empfangen (unabhängig davon, ob er sich im Vorder- oder Hintergrund befindet), es sei denn, eine andere App, die eine datenschutzrelevante Audioquelle verwendet, nimmt bereits auf.

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

Beachte, dass beide Apps nur dann Audio empfangen, wenn Assistant im Hintergrund ausgeführt wird und die andere App nicht von einer datenschutzrelevanten Audioquelle aufnimmt.

Bedienungshilfe + normale App

Für ein AccessibilityService ist eine strikte Deklaration erforderlich.

Android gibt die Audioeingabe gemäß den folgenden Regeln weiter:

  • Wenn die Benutzeroberfläche des Dienstes im Vordergrund ist, erhalten sowohl der Dienst als auch die App Audioeingaben. Dieses Verhalten bietet Funktionen wie die Steuerung eines Sprachanrufs oder einer Videoaufnahme mit Sprachbefehlen.

  • Wenn der Dienst nicht im Vordergrund ist, wird dieser Fall wie der normale Fall mit zwei Apps unten behandelt.

Zwei gewöhnliche Apps

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

Android gibt die Audioeingabe gemäß den folgenden Regeln weiter:

  • Wenn keine der Apps datenschutzrelevant ist, erhält die App mit einer Benutzeroberfläche im Vordergrund die Audioausgabe. Wenn keine der Apps eine Benutzeroberfläche hat, erhält die App, die die Aufnahme zuletzt gestartet hat, Audio.
  • Wenn eine der Apps datenschutzrelevant ist, empfängt sie Audio und die andere App empfängt Stille, auch wenn sie eine UI im Vordergrund hat oder die Aufnahme erst später gestartet hat.
  • Wenn beide Apps datenschutzrelevant sind, erhält die App, die zuletzt mit der Aufnahme begonnen hat, Audio und die andere App erhält 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 die Audioeingabe gemäß den folgenden Regeln weiter:

Verhalten von 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, Audio gleichzeitig aufzunehmen, unabhängig vom ausgewählten Anwendungsfall aktiviert und deaktiviert werden kann.

Die neuen Methoden sind:

Wenn setPrivacySensitive() den Wert true hat, ist der Anwendungsfall für die Aufnahme privat und selbst ein privilegierter Assistent 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 eine oder zwei davon „aktiv“ (empfangen Audio). Die anderen sind stummgeschaltet (empfangen Stille). Wenn sich die aktiven Apps ändern, kann das Audio-Framework die Audiopfade gemäß den folgenden Regeln neu konfigurieren:

  • 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 möglicherweise stummgeschaltet wird, wenn eine App mit höherer Priorität aktiv wird, können Sie einen AudioManager.AudioRecordingCallback für das Objekt AudioRecord oder MediaRecorder 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-Eigenschaften 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 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ückgegebenen Audiodaten aufgrund der Aufnahmerichtlinie derzeit stummgeschaltet sind.
getAudioDevice()
Gibt das aktive Audiogerät zurück.
getEffects()
Gibt den aktiven Vorverarbeitungseffekt zurück. Beachten Sie, dass der aktive Effekt möglicherweise nicht mit dem von getClientEffects() zurückgegebenen Effekt übereinstimmt, wenn der Client nicht die aktive App mit der höchsten Priorität ist.
getFormat()
Gibt die Streamattribute 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 die erforderliche Resampling-, Kanal- und Formatkonvertierung vom Format der Hardwareschnittstelle in das vom Client angegebene Format durch.
AudioRecord.getActiveRecordingConfiguration()
Gibt die aktive Aufzeichnungskonfiguration zurück.

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