Eine App kann Video- oder Audioinhalte aufzeichnen, die in einer anderen App wiedergegeben werden. Solche Apps müssen das MediaProjection
-Token korrekt verarbeiten. Auf dieser Seite wird erläutert, wie das geht. Außerdem wird gezeigt, 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 wiedergegebenen Inhalte aufzeichnen.
MediaProjection
-Token verarbeiten
Mit der MediaProjection
API können Apps ein MediaProjection
-Token abrufen, das ihnen einmaligen Zugriff auf die Aufnahme von Bildschirminhalten oder Audio gewährt. Das Android-Betriebssystem fragt den Nutzer nach seiner Einwilligung, bevor es das Token an Ihre App weitergibt.
Das Betriebssystem zeigt die aktiven MediaProjection
-Tokens in den Schnelleinstellungen an und ermöglicht es Nutzern, den Zugriff auf ein Token jederzeit zu widerrufen. In diesem Fall werden keine Media-Streams mehr an die virtuellen Displays oder Audio-Streams gesendet, die mit der Sitzung verknüpft sind. Ihre App muss angemessen reagieren, da sonst weiterhin Stille oder ein schwarzer Videostream aufgezeichnet wird.
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 ScreenCapture-Beispiel-App erfahren Sie, wie Sie die Media Projection API verwenden, um den Bildschirm eines Geräts in Echtzeit aufzunehmen und in einer SurfaceView anzuzeigen.
Mit dem DevicePolicyManager
können Sie die Bildschirmaufzeichnung verhindern. Bei Unternehmenskonten (Android for Work) kann der Administrator die Erhebung von Assistentendaten für das Arbeitsprofil mit der Methode setScreenCaptureDisabled deaktivieren.
Im Codelab Android-Geräte ohne App verwalten wird gezeigt, wie Screenshots verboten werden.
Audiowiedergabe aufzeichnen
Die AudioPlaybackCapture API wurde in Android 10 eingeführt. Mit dieser API können Apps die Audioinhalte kopieren, die von anderen Apps wiedergegeben werden. Diese Funktion ist das Audio-Pendant zur Bildschirmaufnahme. Der primäre Anwendungsfall sind Streaming-Apps, die den von Spielen wiedergegebenen Ton aufnehmen möchten.
Hinweis: Die AudioPlaybackCapture API hat keine Auswirkungen auf die Latenz der App, deren Audio aufgenommen wird.
Aufnahme-App entwickeln
Aus Sicherheits- und Datenschutzgründen unterliegt die Aufnahme der Wiedergabe einigen Einschränkungen. Damit eine App Audio aufnehmen kann, muss sie die folgenden Anforderungen erfüllen:
- Die App muss die Berechtigung
RECORD_AUDIO
haben. - Die App muss den von
MediaProjectionManager.createScreenCaptureIntent()
angezeigten Prompt aufrufen und der Nutzer muss ihn genehmigen. - Die Apps zum Aufzeichnen und Abspielen müssen sich im selben Nutzerprofil befinden.
Wenn Ihre App Audio von einer anderen App aufnehmen soll, muss sie ein AudioRecord
-Objekt erstellen und ihm ein AudioPlaybackCaptureConfiguration
hinzufügen. Gehen Sie dazu so vor:
- Rufen Sie
AudioPlaybackCaptureConfiguration.Builder.build()
auf, um einAudioPlaybackCaptureConfiguration
zu erstellen. - Übergeben Sie die Konfiguration an
AudioRecord
, indem SiesetAudioPlaybackCaptureConfig
aufrufen.
Audioaufnahme steuern
Ihre App kann festlegen, welche Arten von Inhalten sie aufzeichnen kann und welche anderen Apps ihre eigene Wiedergabe aufzeichnen können.
Aufnahme durch Audioinhalte einschränken
Eine App kann einschränken, welche Audioinhalte sie erfassen darf, indem sie die folgenden Methoden verwendet:
- Übergeben Sie ein
AUDIO_USAGE
an AudioPlaybackCaptureConfiguration.addMatchingUsage(), um die Erfassung einer bestimmten Verwendung zu ermöglichen. Rufen Sie die Methode mehrmals auf, um mehr als eine Verwendung anzugeben. - Übergeben Sie ein
AUDIO_USAGE
an AudioPlaybackCaptureConfiguration.excludeUsage(), um die Erfassung dieser Nutzung zu verbieten. Rufen Sie die Methode mehrmals auf, um mehr als eine Verwendung 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 das Erfassen dieser UID zu verbieten. Rufen Sie die Methode mehrmals auf, um mehrere UIDs anzugeben.
Die Methoden addMatchingUsage()
und excludeUsage()
können nicht zusammen verwendet werden. Sie müssen sich für eine der beiden Optionen entscheiden. 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 keine Audioinhalte von ihr aufnehmen können. Audioinhalte einer App können nur aufgezeichnet werden, wenn die App die folgenden Anforderungen erfüllt:
Nutzung
Der Player, der die Audioausgabe erzeugt, muss seine Nutzung auf USAGE_MEDIA
, USAGE_GAME
oder USAGE_UNKNOWN
festlegen.
Erfassungsrichtlinie
Die Aufnahmerichtlinie des Spielers muss AudioAttributes.ALLOW_CAPTURE_BY_ALL
sein, damit andere Apps die Wiedergabe aufzeichnen können. Dazu gibt es verschiedene Möglichkeiten:
- Wenn Sie die Aufnahme 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 Player 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 jedes vom Player erzeugte Audio aufgenommen werden.
Systemerfassung deaktivieren
Die oben beschriebenen Schutzmaßnahmen, die die Erfassung ermöglichen, 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 die Aufnahme ihrer Wiedergabe ermöglichen. In dem seltenen Fall, dass Sie nicht möchten, dass das System die Wiedergabe Ihrer App aufzeichnet, legen Sie die Aufzeichnungsrichtlinie auf ALLOW_CAPTURE_BY_NONE
fest.
Richtlinie zur 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 wiedergegeben wird, wenn Sie die Methode aufrufen, wird das Audio nicht beeinflusst. Sie müssen den Player oder Track 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 verstehen, wie die effektive Richtlinie bestimmt wird.
Es wird immer die restriktivste Erfassungsrichtlinie angewendet. Eine App, deren Manifest beispielsweise setAllowedCapturePolicy="false"
enthält, erlaubt niemals, dass Nicht-System-Apps ihre Audioinhalte aufnehmen, selbst wenn AudioManager#setAllowedCapturePolicy
auf ALLOW_CAPTURE_BY_ALL
festgelegt ist. Wenn AudioManager#setAllowedCapturePolicy
auf ALLOW_CAPTURE_BY_ALL
festgelegt ist und im Manifest setAllowedCapturePolicy="true"
festgelegt ist, die AudioAttributes
des Media-Players aber mit AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
erstellt wurden, kann dieser Media-Player nicht von Nicht-System-Apps erfasst werden.
In der folgenden Tabelle wird die Wirkung des Manifestattributs und der wirksamen Richtlinie zusammengefasst:
allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | jede App | Nur System | Keine Aufnahme |
false | Nur System | Nur System | Keine Aufnahme |