Der Audioeingang stammt in der Regel vom integrierten Mikrofon, einem externen Mikrofon oder einer Audioschnittstelle, die mit dem Gerät verbunden ist. Die Audioeingabe kann auch aus einem Telefongespräch 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 „Aufzeichnung“ sein, z. B. 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 „Aufzeichnung“, 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 Bereitstellung des Audiosignals aus derselben Quelle für alle Apps kommen. Auf dieser Seite wird beschrieben, wie das Android-System den Audioeingang für mehrere Apps freigibt, die Audio erfassen.
Verhalten vor Android 10
Vor Android 10 konnte der Eingabe-Audiostream nur von einer App gleichzeitig erfasst werden. Wenn eine andere App bereits Audio aufzeichnet oder abhört, kann Ihre App 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 App mit erhöhten Berechtigungen (z. B. Google Assistant oder ein Dienst zur Barrierefreiheit) die Berechtigung android.permission.CAPTURE_AUDIO_HOTWORD
hatte und eine Audioquelle vom Typ HOTWORD
verwendete. In diesem Fall könnte eine andere App die Aufzeichnung starten. In diesem Fall wurde die App mit erhöhten Berechtigungen beendet und die neue App hat die Eingabe erfasst.
In Android 9 wurde noch eine weitere Änderung hinzugefügt: Nur Apps, die im Vordergrund ausgeführt werden (oder ein Dienst im Vordergrund), konnten den Audioeingang erfassen. Wenn eine App ohne Dienst oder Benutzeroberflächenkomponente im Vordergrund die Aufzeichnung gestartet hat, wurde die App zwar weiter ausgeführt, aber es wurde kein Ton aufgenommen, 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 die Audioaufnahme ausführt, beendet wird.
Android 10 verwendet ein Prioritätsschema, mit dem der Eingabe-Audiostream während der Ausführung zwischen Apps umgeschaltet werden kann. Wenn eine neue App den Audioeingang abruft, läuft die zuvor aufgezeichnete App in den meisten Fällen weiter, empfängt aber nur Stille. In einigen Fällen kann das System Audio weiterhin an beide Apps senden. Die verschiedenen Freigabeszenarien werden unten erläutert.
Dieses Schema ähnelt der Art und Weise, wie der Audiofokus mehrere Apps behandelt, die um die Verwendung der Audioausgabe konkurrieren. Der Audiofokus wird jedoch durch programmatische Anfragen verwaltet, um den Fokus zu erhalten und freizugeben. Das hier beschriebene Eingabeschaltungsschema basiert dagegen 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.
- „Berechtigte“ Apps sind auf dem Gerät vorinstalliert. Dazu gehören Google Assistant und alle Dienste zur Barrierefreiheit.
Außerdem wird eine App anders behandelt, wenn sie eine „datenschutzsensible“ Audioquelle verwendet: CAMCORDER
oder VOICE_COMMUNICATION
.
Für die Nutzung und Freigabe von Audioeingaben gelten Priorisierungsregeln:
- Berechtigte Apps haben eine höhere Priorität als normale Apps.
- Apps mit sichtbarer Benutzeroberfläche im Vordergrund haben eine höhere Priorität als Apps im Hintergrund.
- Apps, die Audio von einer datenschutzsensiblen Quelle erfassen, 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 App mit erhöhten Berechtigungen die Audioeingabe für eine andere App freigeben.
- 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 zu erfassen, können beide das Eingabesignal empfangen oder eine davon möglicherweise nur Stille.
Es gibt vier Hauptszenarien:
- Assistant und normale App
- Bedienungshilfe + normale App
- Zwei normale Apps
- Sprachanruf + normale App
Assistant und normale 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 Eingabeaudio gemäß den folgenden Regeln frei:
Assistant kann Audio empfangen, unabhängig davon, ob er im Vordergrund oder im Hintergrund aktiv ist, es sei denn, eine andere App mit einer datenschutzsensiblen Audioquelle nimmt bereits Audio auf.
Die App empfängt Audio, es sei denn, Assistant hat oben auf dem Bildschirm eine sichtbare Benutzeroberfläche.
Hinweis: Beide Apps erhalten nur dann Audio, wenn Assistant im Hintergrund läuft und die andere App keine Daten von einer datenschutzsensiblen Audioquelle erfasst.
Bedienungshilfe + normale App
Für AccessibilityService
ist eine strenge Deklaration erforderlich.
Android gibt die Eingabeaudio gemäß den folgenden Regeln frei:
Wenn die Benutzeroberfläche des Dienstes oben angezeigt wird, erhalten 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 angezeigt wird, wird dieser Fall wie der normale Fall mit zwei Apps unten behandelt.
Zwei normale Apps
Wenn zwei Apps gleichzeitig aufnehmen, erhält nur eine App Audio und die andere nur Stille.
Android gibt die Eingabeaudio gemäß den folgenden Regeln frei:
- Wenn keine der Apps datenschutzrelevant ist, erhält die App mit der Benutzeroberfläche oben den Audiostream. Wenn keine der Apps eine Benutzeroberfläche hat, wird die Audioaufnahme von der App gestartet, die die Aufzeichnung am spätesten gestartet hat.
- Wenn eine der Apps datenschutzrelevant ist, wird sie mit Audiosignalen versorgt und die andere App erhält nur Stille, auch wenn sie eine Benutzeroberfläche hat oder erst vor Kurzem mit der Aufnahme begonnen hat.
- Wenn beide Apps datenschutzrelevant sind, erhält die App, die die Aufzeichnung am häufigsten gestartet hat, Audio und die andere App 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 Eingabeaudio gemäß den folgenden Regeln frei:
- Der Anruf empfängt immer Audio.
- Die App kann Audiodaten erfassen, wenn es sich um einen Bedienungshilfendienst handelt.
Die App kann den Sprachanruf aufzeichnen, wenn es sich um eine privilegierte (vorinstallierte) App mit der Berechtigung
CAPTURE_AUDIO_OUTPUT
handelt.Wenn der Uplink (TX), der Downlink (RX) oder beides des Sprachanrufs aufgezeichnet werden soll, muss die App die Audioquellen
MediaRecorder.AudioSource.VOICE_UPLINK
oderMediaRecorder.AudioSource.VOICE_DOWNLINK
und/oder das GerätAudioDeviceInfo.TYPE_TELEPHONY
angeben.
Verhalten unter Android 11
Unter Android 11 (API-Level 30) wird das oben beschriebene Prioritätsschema von Android 10 verwendet. Außerdem gibt es neue Methoden in AudioRecord
, MediaRecorder
und AAudioStream
, mit denen die gleichzeitige Audioaufnahme unabhängig vom ausgewählten Anwendungsfall aktiviert und deaktiviert werden kann.
Die neuen Methoden sind:
AudioRecord.Builder.setPrivacySensitive()
AudioRecord.isPrivacySensitive()
MediaRecorder.setPrivacySensitive()
MediaRecorder.isPrivacySensitive()
AAudioStreamBuilder_setPrivacySensitive()
AAudioStream_isPrivacySensitive()
Wenn setPrivacySensitive()
true
ist, ist der Aufnahmefall privat und selbst ein privilegierter Assistant kann nicht gleichzeitig aufnehmen. Mit dieser Einstellung wird das standardmäßige Verhalten überschrieben, 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 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, ist 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 Objekt AudioRecord
oder MediaRecorder
registrieren, um benachrichtigt zu werden, wenn sich die Konfiguration ändert.
Mögliche Änderungen:
- Mit 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 Aufnahme gestartet wird.
Der Callback wird nur ausgeführt, wenn die App Audio empfängt und sich etwas ändert.
Die Methode onRecordingConfigChanged()
gibt ein AudioRecordingConfiguration
-Objekt zurück, das den aktuellen Status der Audioaufnahme enthält. So können Sie sich über die Änderung informieren:
isClientSilenced()
- Gibt „true“ zurück, wenn der an den Client zurückgegebene Audiostream aufgrund der Aufnahmerichtlinie derzeit stummgeschaltet wird.
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 Stream-Properties zurück. Die vom Client empfangenen Audiodaten müssen immer dem von
getClientFormat()
zurückgegebenen erforderlichen Format entsprechen. Das Framework führt automatisch die erforderlichen Resampling-, Kanal- und Formatkonvertierungen vom an der Hardwareschnittstelle verwendeten Format in das vom Client angegebene Format aus. AudioRecord.getActiveRecordingConfiguration()
.- Die aktive Aufzeichnungskonfiguration.
Wenn Sie AudioManager.getActiveRecordingConfigurations()
aufrufen, erhalten Sie eine allgemeine Übersicht über alle aktiven Aufnahmen auf dem Gerät.