Audioeingabe wird geteilt

Die Audioeingabe erfolgt normalerweise über das integrierte Mikrofon, ein externes Mikrofon oder einen Audioschnittstelle, die an das Gerät angeschlossen ist. Die Audioeingabe kann auch über Telefongespräch zu führen.

Manchmal sind zwei oder mehr Apps dieselbe Audioeingabe. Sie führen möglicherweise unterschiedliche Aufgaben aus. Einige Apps, die Audio empfangen, wie ein einfaches Stimmrekorder, während andere Apps „Zuhören“ nutzen, etwa Google Assistant oder eine Bedienungshilfe, auf Sprachbefehle zu reagieren.

In beiden Fällen möchten diese Apps die Audioeingabe empfangen. Auf dieser Seite verwenden wir den Begriff unabhängig davon, ob ein nimmt die App auf oder hört nur zu.

Wenn zwei oder mehr Apps gleichzeitig Audio aufnehmen möchten, gibt es möglicherweise ein Problem. das Audiosignal aus derselben Quelle an alle zu übertragen. Auf dieser Seite wird Folgendes beschrieben: wie das Android-System die Audioeingabe zwischen mehreren Apps teilt, die Audio aufnehmen.

Verhalten vor Android 10

Vor Android 10 konnte der Eingangs-Audiostream nur von jeweils einer App . Wenn eine App bereits Audio aufzeichnet oder abhört, kann sie ein AudioRecord-Objekt erstellen, aber beim Aufruf von AudioRecord.startRecording() und die Aufzeichnung startete nicht.

Eine Ausnahme von dieser Regel war, wenn eine privilegierte App wie Google Assistant oder eine Bedienungshilfe) android.permission.CAPTURE_AUDIO_HOTWORD und es wurde eine Audioquelle vom Typ verwendet HOTWORD. In diesem Fall könnte eine andere App mit der Aufzeichnung beginnen. Als das passierte, die privilegierte App beendet wurde und die neue App die Eingabe erfasst hat.

In Android 9 wurde eine weitere Änderung hinzugefügt: Nur Apps, die im Vordergrund ausgeführt werden, ein Dienst im Vordergrund) die Audioeingabe erfassen kann. Wenn eine App ohne oder die UI-Komponente im Vordergrund mit der Erfassung begonnen hat, lief weiter, wurde aber stillgelegt, selbst wenn es die einzige App war, die Audio.

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 mehr auf den bis die App, die die Audioaufnahme aufzeichnet, beendet wird.

In Android 10 gibt es ein Prioritätsschema, mit dem der Audioeingangsstream gewechselt werden kann zwischen Apps wechseln, während sie ausgeführt werden. Wenn eine neue App die Audioeingabe übernimmt, wird die App weiter ausgeführt, aber die Aufnahme ist still. In einigen Fälle, in denen das System weiterhin Audio an beide Apps senden kann. Die verschiedenen Freigabeszenarien werden unten erläutert.

Dieses Schema ähnelt der Art und Weise, wie der Audiofokus mehrere Apps verarbeitet um die Nutzung der Audioausgabe konkurrieren. Der Audiofokus wird jedoch von bei programmatischen Anfragen, um den Fokus zu gewinnen und freizugeben, während die Eingabewechsel das hier beschriebene Schema auf einer Priorisierungsrichtlinie basiert, automatisch, wenn eine neue App mit der Audioaufnahme beginnt.

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

  • „Normal“ Apps werden vom Nutzer installiert.
  • „Privilegiert“ Apps sind auf dem Gerät vorinstalliert. Dazu gehören Google Assistant und alle Bedienungshilfen.

Außerdem wird eine App anders behandelt, wenn es eine „datenschutzsensible“ Audioquelle: 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 beide das Eingabesignal empfangen oder einer von ihnen empfängt Stille.

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

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

Android gibt die Audioeingabe nach den folgenden Regeln weiter:

  • Assistant kann Audio empfangen, egal ob im Vordergrund oder im Hintergrund. es sei denn, eine andere App, die eine datenschutzkonforme Audioquelle verwendet, nimmt bereits Daten auf.

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

Beachte, dass beide Apps Audio nur empfangen, wenn Assistant im Hintergrund ausgeführt wird Die andere App nimmt keine Audioquelle auf, bei der der Datenschutz nicht unterstützt wird.

Bedienungshilfe + gewöhnliche App

Ein AccessibilityService erfordert eine strenge Deklaration.

Android gibt die Audioeingabe nach den folgenden Regeln weiter:

  • Wenn sich die UI des Dienstes oben befindet, erhalten sowohl der Dienst als auch die App Audioeingabe. Dieses Verhalten bietet Funktionen wie die Steuerung eines Sprachanrufs oder Videos per Sprachbefehl aufnehmen.

  • Wenn sich der Dienst nicht oben befindet, 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, die App mit einer UI oben Audio empfängt. Wenn keine der beiden Apps eine Benutzeroberfläche hat, empfängt die App, die mit der Aufnahme der neuesten App begonnen hat, Audio.
  • Ist bei einer der Apps der Datenschutz gewährleistet, empfängt sie Audio und das Die andere App ist stummgeschaltet, auch wenn sie über eine UI verfügt oder mit der Aufnahme beginnt. in letzter Zeit.
  • Wenn beide Apps datenschutzfreundlich sind, hat die App, die die meisten Daten erhält kürzlich Audio zu hören und der andere geht lautlos.

Sprachanruf + normale App

Ein Sprachanruf ist aktiv, wenn der Audiomodus, der von AudioManager.getMode() ist MODE_IN_CALL oder MODE_IN_COMMUNICATION

Android gibt die Audioeingabe nach den folgenden Regeln weiter:

Verhalten von Android 11

Android 11 (API-Level 30) berücksichtigt das Prioritätsschema von Android 10 beschrieben. Außerdem bietet es neue Methoden in AudioRecord, MediaRecorder und AAudioStream festlegen, mit denen die Möglichkeit zur gleichzeitigen Audioaufnahme aktiviert oder deaktiviert wird. und zwar 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 gleichmäßig ein privilegierter Assistent nicht gleichzeitig aufnehmen kann. Diese Einstellung überschreibt die 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, werden nur eine oder zwei Apps gleichzeitig aufgenommen. „aktiv“ (Audio empfangen); die anderen sind stummgeschaltet (Stille werden empfangen). Wenn der Parameter aktive Apps ändern, konfiguriert das Audio-Framework die Audiopfade möglicherweise neu. gemäß diesen Regeln:

  • Das Audioeingabegerät für jede aktive App kann sich ändern (z. B. von das integrierte Mikrofon an ein angeschlossenes Bluetooth-Headset an.
  • Die Vorverarbeitung, die der aktiven Anwendung mit der höchsten Priorität zugeordnet ist, ist aktiviert. Alle andere Vorverarbeitungen ignoriert.

Da eine aktive App möglicherweise stummgeschaltet wird, wenn eine App mit höherer Priorität aktiv wird, können Sie eine AudioManager.AudioRecordingCallback am AudioRecord oder MediaRecorder Objekt, das 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)

Du musst anrufen AudioRecord.registerAudioRecordingCallback() 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 Status der Audioaufnahme enthält. Verwenden Sie Folgendes: 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. Beachten Sie, dass der aktive Effekt möglicherweise nicht mit dem von getClientEffects() zurückgegebenen Effekt identisch ist, wenn der Client nicht die aktive App mit der höchsten Priorität ist.
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.

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