Eine App kann das Video oder Audio aufnehmen, das von einer anderen App abgespielt wird. Solche Apps müssen das MediaProjection
-Token richtig verarbeiten. Auf dieser Seite wird erläutert, wie das geht. Außerdem erfahren Sie, wie ein Geräteadministrator die Möglichkeit zum Aufzeichnen von Screenshots deaktivieren kann und wie eine Audio-App verhindern kann, dass andere Apps die von ihr abgespielten Inhalte aufzeichnen.
Umgang mit einem MediaProjection
-Token
Mit der MediaProjection
API können Apps ein MediaProjection
-Token abrufen, das ihnen einmalig Zugriff auf die Aufnahme von Bildschirminhalten oder Audioinhalten gewährt. Das Android-Betriebssystem fragt den Nutzer um Erlaubnis, bevor das Token Ihrer App gewährt wird.
Das Betriebssystem zeigt die aktiven MediaProjection
-Tokens in der Benutzeroberfläche der Schnelleinstellungen an und ermöglicht es Nutzern, den Zugriff auf ein Token jederzeit zu widerrufen. In diesem Fall werden die mit der Sitzung verknüpften virtuellen Displays oder Audiostreams nicht mehr mit Medienstreams versorgt. Ihre App muss entsprechend reagieren, andernfalls wird weiterhin Audiostille oder ein schwarzer Videostream aufgezeichnet.
Wenn ein Token verloren geht, registrieren Sie einen Callback für die MediaProjection
-Instanz mit der Methode registerCallback
und beenden Sie die Aufzeichnung, wenn die Methode onStop
aufgerufen wird.
Weitere Informationen finden Sie unter Medienprojektion.
Video aufnehmen
In der Beispiel-App „ScreenCapture“ erfahren Sie, wie Sie mit der Media Projection API den Bildschirm eines Geräts in Echtzeit erfassen und in einer SurfaceView anzeigen.
Mit der Taste DevicePolicyManager
können Sie die Bildschirmaufzeichnung verhindern. Bei Enterprise-Konten (Android for Work) kann der Administrator die Erhebung von Assistentendaten für das Arbeitsprofil mithilfe der Methode setScreenCaptureDisabled deaktivieren.
Im Codelab Android-Geräte ohne App verwalten wird gezeigt, wie Sie Screenshots verbieten.
Audiowiedergabe erfassen
Die AudioPlaybackCapture API wurde in Android 10 eingeführt. Mit dieser API können Apps Audioinhalte kopieren, die von anderen Apps wiedergegeben werden. Diese Funktion ist das Äquivalent zur Bildschirmaufnahme, aber für Audio. Der Hauptanwendungsfall sind Streaming-Apps, die das von Spielen wiedergegebene Audio aufnehmen möchten.
Die AudioPlaybackCapture API hat keine Auswirkungen auf die Latenz der App, deren Audio erfasst wird.
App für die Bild- und Videoaufnahme entwickeln
Aus Sicherheits- und Datenschutzgründen gelten für die Wiedergabeaufzeichnung einige Einschränkungen. Damit eine App Audio aufnehmen kann, muss sie folgende Anforderungen erfüllen:
- Die App muss die Berechtigung
RECORD_AUDIO
haben. - Die App muss die Aufforderung von
MediaProjectionManager.createScreenCaptureIntent()
anzeigen und der Nutzer muss sie genehmigen. - Die Apps zum Aufnehmen und Abspielen müssen sich im selben Nutzerprofil befinden.
Wenn Sie Audio von einer anderen App aufnehmen möchten, muss Ihre App ein AudioRecord
-Objekt erstellen und ihm ein AudioPlaybackCaptureConfiguration
hinzufügen. Gehen Sie dazu so vor:
- Rufen Sie
AudioPlaybackCaptureConfiguration.Builder.build()
auf, um einenAudioPlaybackCaptureConfiguration
zu erstellen. - Übergeben Sie die Konfiguration an die
AudioRecord
, indem SiesetAudioPlaybackCaptureConfig
aufrufen.
Audioaufnahme steuern
Ihre App kann festlegen, welche Arten von Inhalten sie aufzeichnen kann und welche anderen Arten von Apps ihre eigene Wiedergabe aufzeichnen können.
Aufnahme durch Audioinhalte einschränken
Eine App kann mithilfe der folgenden Methoden einschränken, welche Audioinhalte aufgenommen werden können:
- Übergeben Sie eine
AUDIO_USAGE
an AudioPlaybackCaptureConfiguration.addMatchingUsage(), um die Erfassung einer bestimmten Nutzung zuzulassen. Rufen Sie die Methode mehrmals auf, um mehrere Verwendungen anzugeben. - Wenn Sie die Erfassung dieser Nutzung unterbinden möchten, übergeben Sie
AUDIO_USAGE
an AudioPlaybackCaptureConfiguration.excludeUsage(). Rufen Sie die Methode mehrmals auf, um mehrere Verwendungen anzugeben. - Übergeben Sie eine UID an AudioPlaybackCaptureConfiguration.addMatchingUid(), um nur Apps mit einer bestimmten UID zu erfassen. Rufen Sie die Methode mehrmals auf, um mehrere UIDs anzugeben.
- Übergeben Sie eine UID an AudioPlaybackCaptureConfiguration.excludeUid(), um die Erfassung dieser UID zu unterbinden. Rufen Sie die Methode mehrmals auf, um mehrere UIDs anzugeben.
Die Methoden addMatchingUsage()
und excludeUsage()
können nicht gleichzeitig verwendet werden. Sie müssen eine der beiden Optionen auswählen. Ebenso können Sie addMatchingUid()
und excludeUid()
nicht gleichzeitig verwenden.
Aufnahmen durch andere Apps einschränken
Sie können eine App so konfigurieren, dass andere Apps keine Audioinhalte davon erfassen können. Audio von einer App kann nur erfasst werden, wenn die App diese Anforderungen erfüllt:
Nutzung
Der Player, der das Audio erzeugt, muss die Verwendung auf USAGE_MEDIA
, USAGE_GAME
oder USAGE_UNKNOWN
festlegen.
Erfassungsrichtlinie
Die Aufnahmerichtlinie des Players muss AudioAttributes.ALLOW_CAPTURE_BY_ALL
sein, damit andere Apps die Wiedergabe aufzeichnen können. Dazu gibt es mehrere Möglichkeiten:
- Wenn Sie die Aufzeichnung für alle Spieler aktivieren möchten, fügen Sie
android:allowAudioPlaybackCapture="true"
in die Dateimanifest.xml
der App ein. - Sie können die Aufzeichnung 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, kann jegliche Audioausgabe des Players aufgezeichnet werden.
Systemaufzeichnung deaktivieren
Die oben beschriebenen Schutzmaßnahmen, die die Erfassung zulassen, gelten nur für Apps. Android-Systemkomponenten können die Wiedergabe standardmäßig erfassen.
Viele dieser Komponenten werden von Android-Anbietern angepasst und unterstützen Funktionen wie Bedienungshilfen und Untertitel. Aus diesem Grund wird empfohlen, dass Apps dem System erlauben, die Wiedergabe aufzuzeichnen. In seltenen Fällen, in denen Sie nicht möchten, dass die Wiedergabe Ihrer App vom System erfasst wird, legen Sie die Erfassungsrichtlinie auf ALLOW_CAPTURE_BY_NONE
fest.
Richtlinie während der Laufzeit festlegen
Sie können AudioManager.setAllowedCapturePolicy()
aufrufen, um die Aufnahmerichtlinie zu ändern, während eine App ausgeführt wird. Wenn ein MediaPlayer oder AudioTrack beim Aufrufen der Methode wiedergegeben wird, ist das Audio nicht betroffen. Du musst den Player oder Titel schließen und wieder öffnen, damit die Richtlinienänderung wirksam wird.
Richtlinie = Manifest + AudioManager + AudioAttributes
Da die Erfassungsrichtlinie an mehreren Stellen angegeben werden kann, ist es wichtig zu wissen, wie die wirksame Richtlinie ermittelt wird.
Es wird immer die strengste Richtlinie für die Erfassung angewendet. Eine App, deren Manifest setAllowedCapturePolicy="false"
enthält, erlaubt es beispielsweise niemals Drittanbieter-Apps, Audioinhalte zu erfassen, auch wenn AudioManager#setAllowedCapturePolicy
auf ALLOW_CAPTURE_BY_ALL
festgelegt ist. Wenn AudioManager#setAllowedCapturePolicy
auf ALLOW_CAPTURE_BY_ALL
und das Manifest auf setAllowedCapturePolicy="true"
festgelegt ist, die AudioAttributes
des Mediaplayers aber mit AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
erstellt wurde, kann dieser Mediaplayer nicht von nicht systemeigenen Apps erfasst werden.
In der folgenden Tabelle wird die Wirkung des Manifest-Attributs und der wirksamen Richtlinie zusammengefasst:
allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
wahr | in jeder App | Nur System | keine Aufnahme |
false | Nur System | Nur System | keine Aufnahme |