Video- und Audiowiedergabe aufnehmen

Eine App kann das Video oder Audio aufzeichnen, das von einer anderen App wiedergegeben wird. 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.

Umgang mit einem MediaProjection-Token

Mit der MediaProjection API können Apps ein MediaProjection-Token abrufen, das ihnen einmaligen Zugriff auf die Aufnahme von Bildschirminhalten oder Audioinhalten gewährt. Das Android-Betriebssystem fragt den Nutzer nach seiner Einwilligung, bevor das Token an Ihre App weitergegeben wird.

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 werden.

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 Projektion von Medieninhalten.

Video aufnehmen

Mit DevicePolicyManager können Sie Bildschirmaufzeichnungen 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 verhindert werden.

Audiowiedergabe aufnehmen

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.

Die AudioPlaybackCapture API hat keine Auswirkungen auf die Latenz der App, deren Audio aufgenommen wird.

Aufnahme-App erstellen

Aus Sicherheits- und Datenschutzgründen unterliegt die Aufnahme von Wiedergaben einigen Einschränkungen. Damit eine App Audio aufnehmen kann, muss sie die folgenden Anforderungen erfüllen:

Wenn Ihre App Audio aus einer anderen App erfassen soll, muss sie ein AudioRecord-Objekt erstellen und ihm ein AudioPlaybackCaptureConfiguration hinzufügen. Gehen Sie so vor:

  1. Rufen Sie AudioPlaybackCaptureConfiguration.Builder.build() auf, um ein AudioPlaybackCaptureConfiguration zu erstellen.
  2. Übergeben Sie die Konfiguration an AudioRecord, indem Sie setAudioPlaybackCaptureConfig 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:

Sie können die Methoden addMatchingUsage() und excludeUsage() nicht zusammen verwenden. 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 aus einer App können nur aufgezeichnet werden, wenn die App die folgenden Anforderungen erfüllt:

Nutzung

Der Player, der die Audioausgabe erzeugt, muss seine Verwendung 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 aufzeichnen können. Dazu gibt es verschiedene Möglichkeiten:

Wenn diese Voraussetzungen erfüllt sind, können alle vom Player erzeugten Audioinhalte aufgezeichnet werden.

Systemaufnahme deaktivieren

Die oben beschriebenen Schutzmaßnahmen, die die Erfassung ermöglichen, gelten nur für Apps. Android-Systemkomponenten können die Wiedergabe standardmäßig aufzeichnen. 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 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 Erfassungsrichtlinie zu ändern, während eine App ausgeführt wird. Wenn beim Aufrufen der Methode ein MediaPlayer oder AudioTrack wiedergegeben wird, hat das keine Auswirkungen auf das Audio. Sie müssen den Player oder den 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 verstehen, wie die effektive Richtlinie bestimmt wird. Es wird immer die restriktivste Erfassungsrichtlinie angewendet. Bei einer App, deren Manifest setAllowedCapturePolicy="false" enthält, können beispielsweise niemals Nicht-System-Apps Audioinhalte aufnehmen, auch 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
wahr jede App Nur System Keine Aufnahme
falsch Nur System Nur System Keine Aufnahme