Eine App kann das Video- oder Audiomaterial aufnehmen, das mit einer anderen App wiedergegeben wird. Solche Apps müssen das MediaProjection
-Token richtig verarbeiten. Auf dieser Seite wird die Vorgehensweise beschrieben. Außerdem wird erläutert, wie ein Geräteadministrator die Möglichkeit zum Erstellen von Bildschirmabbildern deaktivieren kann und wie eine Audio-App verhindern kann, dass andere Apps die wiedergegebenen Inhalte aufzeichnen.
Umgang mit einem MediaProjection
-Token
Mit der MediaProjection
API können Apps ein MediaProjection
-Token abrufen, mit dem sie einmaligen Zugriff auf Bildschirminhalte oder Audio haben. Das Android-Betriebssystem bittet den Nutzer um seine Zustimmung, bevor das Token an Ihre App gesendet wird.
Das Betriebssystem zeigt die aktiven MediaProjection
-Tokens in der Benutzeroberfläche für die Schnelleinstellungen an und ermöglicht Nutzern, den Zugriff auf ein Token jederzeit zu widerrufen. In diesem Fall empfangen die mit der Sitzung verknüpften virtuellen Anzeigen oder Audiostreams keine Medienstreams mehr. Deine App muss entsprechend reagieren. Andernfalls wird die Audiostumme oder ein schwarzer Videostream fortgesetzt.
Um den Verlust eines Tokens zu handhaben, 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 ScreenCapture erfahren Sie, wie Sie mit der Media Projection API den Bildschirm eines Geräts in Echtzeit erfassen und in einer SurfaceView darstellen können.
Mit DevicePolicyManager
können Sie 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 erfahren Sie, wie Screenshots verboten werden.
Audiowiedergabe aufnehmen
Die AudioRecordingCapture API wurde mit Android 10 eingeführt. Mit dieser API können Anwendungen die Audioinhalte kopieren, die von anderen Anwendungen abgespielt werden. Diese Funktion entspricht der Bildschirmaufnahme, jedoch für Audio. Der primäre Anwendungsfall sind Streaming-Apps, die den Ton von Spielen aufzeichnen möchten.
Beachten Sie, dass die AudioWiedergabeCaptureCapture API keinen Einfluss auf die Latenz der App hat, deren Audiodaten erfasst werden.
Aufnahme-App erstellen
Aus Sicherheits- und Datenschutzgründen gelten bei der Aufzeichnung der Wiedergabe 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 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 Audio aus einer anderen App erfassen möchten, muss Ihre App ein AudioRecord
-Objekt erstellen und ihm ein AudioPlaybackCaptureConfiguration
-Objekt 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
Deine App kann steuern, welche Arten von Inhalten sie aufnehmen kann und welche anderen Arten von Apps ihre eigene Wiedergabe aufnehmen können.
Aufnahme durch Audioinhalte einschränken
Mithilfe der folgenden Methoden kann eine App einschränken, welche Audiodaten sie aufnehmen kann:
- Übergeben Sie
AUDIO_USAGE
an AudioRecordingCaptureConfiguration.addMatchingUsage(), um das Erfassen einer bestimmten Nutzung zuzulassen. Rufen Sie die Methode mehrmals auf, um mehr als eine Nutzung anzugeben. - Übergeben Sie
AUDIO_USAGE
an AudioRecordingCaptureConfiguration.excludeUsage(), um das Erfassen dieser Nutzung zu verbieten. Rufen Sie die Methode mehrmals auf, um mehr als eine Nutzung anzugeben. - Übergeben Sie eine UID an AudioRecordingCaptureConfiguration.addMatchingUid(), um nur Apps mit einer bestimmten UID zu erfassen. Rufen Sie die Methode mehrmals auf, um mehr als eine UID anzugeben.
- Übergeben Sie eine UID an AudioRecordingCaptureConfiguration.excludeUid(), um die Erfassung dieser UID zu verhindern. Rufen Sie die Methode mehrmals auf, um mehr als eine UID anzugeben.
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 aufzeichnen. Der Ton einer App kann nur aufgenommen werden, wenn die App die folgenden Anforderungen erfüllt:
Nutzung
Der Player, der die Audiodaten erzeugt, muss seine Nutzung auf USAGE_MEDIA
, USAGE_GAME
oder USAGE_UNKNOWN
festlegen.
Erfassungsrichtlinie
Die Erfassungsrichtlinie des Players muss AudioAttributes.ALLOW_CAPTURE_BY_ALL
lauten, damit andere Apps die Wiedergabe aufzeichnen können. Dazu gibt es mehrere Möglichkeiten:
- Wenn Sie die Aufnahme in allen Playern aktivieren möchten, fügen Sie
android:allowAudioPlaybackCapture="true"
in die Dateimanifest.xml
der App ein. - Du kannst die Aufnahme auch für alle Spieler aktivieren, indem du
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
aufrufst. - 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 jeder Ton vom Player aufgenommen werden.
Systemerfassung wird deaktiviert
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 werden von Android-Anbietern angepasst und unterstützen Funktionen wie Bedienungshilfen und Untertitelung. Aus diesem Grund wird empfohlen, dass das System die Wiedergabe in Apps erfassen kann. Falls Sie nicht möchten, dass das System die Wiedergabe Ihrer App erfasst, setzen Sie 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. Wird beim Aufrufen der Methode ein MediaPlayer oder AudioTrack wiedergegeben, hat dies keine Auswirkungen auf das Audio. Sie müssen den Player oder den 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 wissen, wie die geltende Richtlinie bestimmt wird.
Es wird immer die strengste Erfassungsrichtlinie angewendet. Beispielsweise erlaubt eine App, deren Manifest setAllowedCapturePolicy="false"
enthält, niemals systemfremden Anwendungen, ihre Audiodaten zu erfassen, selbst wenn AudioManager#setAllowedCapturePolicy
auf ALLOW_CAPTURE_BY_ALL
gesetzt ist. Wenn AudioManager#setAllowedCapturePolicy
auf ALLOW_CAPTURE_BY_ALL
gesetzt ist und das Manifest setAllowedCapturePolicy="true"
festlegt, die AudioAttributes
des Mediaplayers jedoch mit AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
erstellt wurden, kann dieser Mediaplayer nicht von Apps außerhalb des Systems erfasst werden.
In der folgenden Tabelle sind die Auswirkungen des Manifestattributs und der geltenden Richtlinie zusammengefasst:
allowAudioWiedergabeCapture | GROẞBUCHSTABEN_ÜBER_ALL_ZULASSEN | GROẞBUCHSTABEN_BY_SYSTEM_ZULASSEN | GROẞBUCHSTABEN_durch_Keine_zulassen |
---|---|---|---|
true | alle Apps | Nur System | Keine Aufnahme |
false | Nur System | Nur System | Keine Aufnahme |