Eine App kann Video- oder Audioinhalte aufzeichnen, die von einer anderen App wiedergegeben werden. Diese Apps müssen das MediaProjection
-Token richtig verarbeiten. Auf dieser Seite erfahren Sie, wie das geht. Außerdem erfahren Sie, wie ein Geräteadministrator die Möglichkeit zum Aufzeichnen von Bildschirm-Snapshots deaktivieren kann und wie eine Audio-App verhindern kann, dass andere Apps die von ihr wiedergegebenen Inhalte aufzeichnen.
So verarbeiten Sie ein MediaProjection
-Token
Mit der MediaProjection
API können Apps ein MediaProjection
-Token abrufen, mit dem sie einmalig Zugriff auf Bildschirminhalte oder Audioinhalte erhalten. Das Android-Betriebssystem fragt den Nutzer nach seiner Zustimmung, bevor das Token an Ihre App weitergegeben wird.
Das Betriebssystem zeigt die aktiven MediaProjection
-Tokens in der Benutzeroberfläche der Schnelleinstellungen an. Nutzer können den Zugriff auf ein Token jederzeit widerrufen. In diesem Fall empfangen die mit der Sitzung verknüpften virtuellen Displays oder Audiostreams keine Medienstreams mehr. Ihre App muss angemessen reagieren. Andernfalls wird weiterhin Audio ohne Ton oder ein schwarzer Videostream aufgezeichnet.
Um den Verlust eines Tokens abzufangen, registrieren Sie mit der Methode registerCallback
einen Callback auf der Instanz MediaProjection
und beenden Sie die Aufzeichnung, wenn die Methode onStop
aufgerufen wird.
Weitere Informationen finden Sie unter Medienprojektion.
Video aufnehmen
In der Beispiel-App „Bildschirmaufnahme“ erfahren Sie, wie Sie mit der Media Projection API den Bildschirm eines Geräts in Echtzeit erfassen und auf einer SurfaceView anzeigen können.
Mit DevicePolicyManager
kannst du die Bildschirmaufzeichnung verhindern. Bei Unternehmenskonten (Android for Work) kann der Administrator die Erhebung von Assistant-Daten für das Arbeitsprofil mithilfe der Methode setScreenCaptureDisabled deaktivieren.
Im Codelab Android-Geräte ohne App verwalten wird gezeigt, wie Screenshots verboten werden.
Audiowiedergabe aufnehmen
Die AudioWiedergabeCapture API wurde mit Android 10 eingeführt. Mit dieser API können Apps das Audio kopieren, das von anderen Apps wiedergegeben wird. Diese Funktion ist analog zur Bildschirmaufnahme, nur für Audio. Der primäre Anwendungsfall sind Streaming-Apps, die das von Spielen gespielte Audio aufzeichnen möchten.
Die AudioWiedergabeCapture API hat keinen Einfluss auf die Latenz der App, deren Audio aufgenommen wird.
Aufnahme-App erstellen
Aus Sicherheits- und Datenschutzgründen gelten bei der Wiedergabe einige Einschränkungen. Damit Sie Audio aufnehmen können, muss eine App die folgenden Anforderungen erfüllen:
- Die App muss die Berechtigung
RECORD_AUDIO
haben. - Die Anwendung muss die von
MediaProjectionManager.createScreenCaptureIntent()
angezeigte Aufforderung aufrufen und der Nutzer muss sie genehmigen. - Die Apps zum Erfassen und Abspielen müssen sich im selben Nutzerprofil befinden.
Wenn Sie Audioinhalte aus einer anderen Anwendung erfassen möchten, muss die Anwendung ein AudioRecord
-Objekt erstellen und diesem ein AudioPlaybackCaptureConfiguration
-Element hinzufügen. Gehen Sie dazu so vor:
- Rufen Sie
AudioPlaybackCaptureConfiguration.Builder.build()
auf, um eineAudioPlaybackCaptureConfiguration
zu erstellen. - Übergeben Sie die Konfiguration an
AudioRecord
, indem SiesetAudioPlaybackCaptureConfig
aufrufen.
Audioaufnahme steuern
Ihre App kann steuern, welche Arten von Inhalten sie aufzeichnen darf und welche anderen Arten von Apps ihre eigene Wiedergabe aufzeichnen können.
Aufnahme durch Audioinhalte einschränken
Eine Anwendung kann mit den folgenden Methoden einschränken, welche Audiodaten erfasst werden können:
- Übergeben Sie
AUDIO_USAGE
an AudioWiedergabeCaptureConfiguration.addMatchingUsage(), um die Erfassung einer bestimmten Nutzung zuzulassen. Rufen Sie die Methode mehrmals auf, um mehr als eine Nutzung anzugeben. - Übergib
AUDIO_USAGE
an AudioWiedergabeCaptureConfiguration.exclusionUsage(), um zu verhindern, dass diese Nutzung erfasst wird. Rufen Sie die Methode mehrmals auf, um mehr als eine Nutzung anzugeben. - Übergib eine UID an AudioWiedergabeCaptureConfiguration.addMatchingUid(), um nur Apps mit einer bestimmten UID zu erfassen. Rufen Sie die Methode mehrmals auf, um mehr als eine UID anzugeben.
- Übergib eine UID an AudioWiedergabeCaptureConfiguration.exclusionUid(), um zu verhindern, dass diese UID erfasst wird. Rufen Sie die Methode mehrmals auf, um mehr als eine UID anzugeben.
Die Methoden addMatchingUsage()
und excludeUsage()
können nicht zusammen verwendet werden. Sie müssen eine der beiden Optionen auswählen. Ebenso können Sie addMatchingUid()
und excludeUid()
nicht gleichzeitig verwenden.
Aufnahme durch andere Apps einschränken
Sie können eine App so konfigurieren, dass andere Apps ihr Audio nicht aufnehmen können. Der Ton einer App kann nur aufgenommen werden, wenn die App die folgenden Anforderungen erfüllt:
Nutzung
Der Player, der die Audioinhalte produziert, muss seine Nutzung auf USAGE_MEDIA
, USAGE_GAME
oder USAGE_UNKNOWN
festlegen.
Aufnahmerichtlinie
Die Aufnahmerichtlinie des Players muss AudioAttributes.ALLOW_CAPTURE_BY_ALL
sein, damit andere Apps die Wiedergabe erfassen können. Dafür gibt es mehrere Möglichkeiten:
- Wenn Sie die Erfassung für alle Spieler aktivieren möchten, fügen Sie
android:allowAudioPlaybackCapture="true"
in die Dateimanifest.xml
der App ein. - Sie können die Aufnahme auch für alle Spieler aktivieren, indem Sie
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
aufrufen. - Sie können die Richtlinie für einen einzelnen Player festlegen, wenn Sie ihn mit
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
erstellen. Wenn SieAAudio
verwenden, rufen SieAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
auf.
Wenn diese Voraussetzungen erfüllt sind, können alle vom Player produzierten Audioinhalte aufgenommen werden.
Systemerfassung deaktivieren
Die oben beschriebenen Schutzmaßnahmen, die eine Erfassung ermöglichen, gelten nur für Apps. Android-Systemkomponenten können die Wiedergabe standardmäßig erfassen.
Viele dieser Komponenten wurden von Android-Anbietern angepasst und unterstützen Funktionen wie Bedienungshilfen und Untertitelung. Aus diesem Grund wird empfohlen, dem System die Erfassung der Wiedergabe durch Apps zu ermöglichen. In dem seltenen Fall, dass das System die Wiedergabe deiner App nicht erfassen soll, setze die Erfassungsrichtlinie auf ALLOW_CAPTURE_BY_NONE
.
Richtlinie zur Laufzeit festlegen
Sie können AudioManager.setAllowedCapturePolicy()
aufrufen, um die Erfassungsrichtlinie zu ändern, während eine Anwendung ausgeführt wird. Wenn ein MediaPlayer oder AudioTrack wiedergegeben wird, wenn Sie die Methode aufrufen, ist das Audio nicht betroffen. Du musst den Player schließen und wieder öffnen, damit die Richtlinienänderung wirksam wird.
Richtlinie = Manifest + AudioManager + AudioAttribute
Da die Aufnahmerichtlinie an mehreren Stellen festgelegt werden kann, ist es wichtig zu verstehen, wie die geltende Richtlinie bestimmt wird.
Es wird immer die restriktivste Aufnahmerichtlinie angewendet. Beispielsweise erlaubt eine App, deren Manifest setAllowedCapturePolicy="false"
enthält, niemals systemfremden Apps die Aufzeichnung der Audiodaten, selbst wenn AudioManager#setAllowedCapturePolicy
auf ALLOW_CAPTURE_BY_ALL
festgelegt ist. Wenn AudioManager#setAllowedCapturePolicy
auf ALLOW_CAPTURE_BY_ALL
gesetzt ist und das Manifest setAllowedCapturePolicy="true"
festlegt, AudioAttributes
des Mediaplayers aber mit AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
erstellt wurde, kann dieser Mediaplayer nur von System-Apps erfasst werden.
In der folgenden Tabelle sind die Auswirkungen des Manifestattributs und der geltenden Richtlinie zusammengefasst:
Audiowiedergabe-Aufnahme zulassen | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | Beliebige App | Nur System | keine Aufnahme |
false | Nur System | Nur System | keine Aufnahme |