Der Audioeingang stammt in der Regel vom integrierten Mikrofon, einem externen Mikrofon oder einer Audioschnittstelle, die mit dem Gerät verbunden ist. Audioeingaben können 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 „aufzeichnen“, wie ein einfacher Sprachrekorder, während andere Apps „zuhören“, z. B. Google Assistant oder ein Bedienungshilfendienst, der auf Sprachbefehle reagiert.
In beiden Fällen möchten diese Apps Audioeingaben erhalten. Auf dieser Seite verwenden wir den Begriff „aufzeichnen“ 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 den Audioeingang 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. Im Folgenden werden die verschiedenen Teilen-Szenarien 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.
Für die Audioaufnahme unterscheidet Android zwei Arten von Apps:
- „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 Verwendung und Freigabe von Audioeingaben gelten die folgenden Prioritätsregeln:
- 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 Berechtigungen die Audioeingabe für eine andere App freigeben.
- Wenn zwei Hintergrund-Apps mit derselben Priorität Audio erfassen, 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 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 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. Dadurch können Sie beispielsweise einen Sprachanruf oder die Videoaufzeichnung per Sprachbefehl steuern.
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 Audiomodus, der von AudioManager.getMode()
zurückgegeben wird, 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. 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, 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 für die aktive App mit der höchsten Priorität 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
- Streameigenschaften geändert (Abtastrate, Kanalmaske, Sample-Format)
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 eine AudioRecordingConfiguration
zurück, die 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()
- Liefert den aktiven Vorverarbeitungseffekt zurück. Hinweis: Der aktive Effekt ist möglicherweise nicht mit dem identisch, der von
getClientEffects()
zurückgegeben wird, 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 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.