MediaPlayer und digitale Rechteverwaltung (DRM) verwenden
Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
Ab Android 8.0 (API-Ebene 26) enthält MediaPlayer
APIs, die die Wiedergabe von mit digitalen Rechteverwaltungsmechanismen geschützten Inhalten unterstützen. Die MediaPlayer-DRM-APIs ähneln der Low-Level-API von MediaDrm
, funktionieren aber auf einer höheren Ebene und geben die zugrunde liegenden Extractor-, DRM- und Kryptoobjekte nicht preis.
Die MediaPlayer DRM API bietet zwar nicht die volle Funktionalität von MediaDrm
, unterstützt aber die gängigsten Anwendungsfälle. Die aktuelle Implementierung kann die folgenden Inhaltstypen verarbeiten:
- Lokale Mediendateien, die mit Widevine geschützt sind
- Von Widevine geschützte Remote- oder Streaming-Mediendateien
Das folgende Code-Snippet zeigt, wie die neuen DRM-MediaPlayer
-Methoden in einer synchronen Implementierung verwendet werden.
Wenn du DRM-geschützte Medien verwalten möchtest, musst du die neuen Methoden in den üblichen Ablauf der MediaPlayer-Aufrufe einbinden, wie in diesem Beispiel gezeigt:
Kotlin
mediaPlayer?.apply {
setDataSource()
setOnDrmConfigHelper() // optional, for custom configuration
prepare()
drmInfo?.also {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
// MediaPlayer is now ready to use
start()
// ...play/pause/resume...
stop()
releaseDrm()
}
Java
setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();
Initialisieren Sie zuerst das MediaPlayer
-Objekt und legen Sie wie gewohnt die Quelle mit setDataSource()
fest. So verwenden Sie DRM:
- Wenn deine App eine benutzerdefinierte Konfiguration ausführen soll, definiere eine
OnDrmConfigHelper
-Benutzeroberfläche und verknüpfe sie mit dem Player über setOnDrmConfigHelper()
.
- Rufen Sie
prepare()
an.
- Rufen Sie
getDrmInfo()
an. Wenn die Quelle DRM-Inhalte enthält, gibt die Methode einen nicht nullwertigen MediaPlayer.DrmInfo
-Wert zurück.
Wenn MediaPlayer.DrmInfo
vorhanden ist:
- Sehen Sie sich die Karte der verfügbaren UUIDs an und wählen Sie eine aus.
- Bereite die DRM-Konfiguration für die aktuelle Quelle vor, indem du
prepareDrm()
aufrufst.
- Wenn Sie einen
OnDrmConfigHelper
-Callback erstellt und registriert haben, wird er während der Ausführung von prepareDrm()
aufgerufen. So kannst du die DRM-Properties anpassen, bevor du die DRM-Sitzung öffnest. Der Callback wird synchron in dem Thread aufgerufen, der prepareDrm()
aufgerufen hat. Rufe getDrmPropertyString()
und setDrmPropertyString()
auf, um auf die DRM-Properties zuzugreifen. Vermeiden Sie lange Vorgänge.
- Wenn das Gerät noch nicht bereitgestellt wurde, greift
prepareDrm()
auch auf den Bereitstellungsserver zu, um das Gerät bereitzustellen. Je nach Netzwerkverbindung kann dies unterschiedlich lange dauern.
- Rufe
getKeyRequest()
auf, um ein Byte-Array für eine Anfrage mit einem undurchsichtigen Schlüssel zu erhalten, das an einen Lizenzserver gesendet werden soll.
- Rufe
provideKeyResponse()
auf, um die DRM-Engine über die vom Lizenzserver empfangene Schlüsselantwort zu informieren. Das Ergebnis hängt vom Typ der Schlüsselanfrage ab:
- Wenn die Antwort auf eine Anfrage für einen Offlineschlüssel erfolgt, ist das Ergebnis eine Schlüsselsatz-ID. Du kannst diese Schlüsselsatz-ID mit
restoreKeys()
verwenden, um die Schlüssel in einer neuen Sitzung wiederherzustellen.
- Wenn die Antwort auf eine Streaming- oder Veröffentlichungsanfrage erfolgt, ist das Ergebnis „null“.
DRM asynchron vorbereiten
Standardmäßig wird prepareDrm()
synchron ausgeführt und blockiert, bis die Vorbereitung abgeschlossen ist. Die allererste DRM-Vorbereitung auf einem neuen Gerät kann jedoch auch eine Bereitstellung erfordern, die von prepareDrm()
intern verarbeitet wird und aufgrund des damit verbundenen Netzwerkbetriebs einige Zeit in Anspruch nehmen kann. Sie können das Blockieren bei prepareDrm()
vermeiden, indem Sie MediaPlayer.OnDrmPreparedListener
definieren und festlegen.
Legen Sie eine OnDrmPreparedListener
fest. prepareDrm()
führt die Bereitstellung (falls erforderlich) und die Vorbereitung im Hintergrund aus. Nach Abschluss der Bereitstellung und Vorbereitung ruft das System den Listener auf. Machen Sie keine Annahmen über die Aufrufsreihenfolge oder den Thread, in dem der Listener ausgeführt wird, es sei denn, Sie registrieren den Listener mit einem Handler-Thread. Das System kann den Listener vor oder nach der Rückgabe von prepareDrm()
aufrufen.
DRM asynchron einrichten
Du kannst die DRM asynchron initialisieren, indem du MediaPlayer.OnDrmInfoListener
für die DRM-Vorbereitung und MediaPlayer.OnDrmPreparedListener
zum Starten des Players erstellst und registrierst. Sie funktionieren in Kombination mit prepareAsync()
, wie in diesem Beispiel gezeigt:
Kotlin
setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
mediaPlayer.apply {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
mediaPlayer.start()
}
Java
setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {
start();
}
Verschlüsselte Medien verarbeiten
Ab Android 8.0 (API-Ebene 26) kann MediaPlayer
auch CENC- und HLS-Medien (Common Encryption Scheme, METHOD=SAMPLE-AES) auf Sampleebene für die Elementarstreamtypen H.264 und AAC entschlüsseln. Bisher wurden verschlüsselte Medien mit dem gesamten Segment (METHOD=AES-128) unterstützt.
Weitere Informationen
Jetpack Media3 ist die empfohlene Lösung für die Medienwiedergabe in Ihrer App. Weitere Informationen
Auf diesen Seiten finden Sie Themen zum Aufzeichnen, Speichern und Abspielen von Audio- und Videoinhalten:
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2025-07-27 (UTC).
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Benötigte Informationen nicht gefunden","missingTheInformationINeed","thumb-down"],["Zu umständlich/zu viele Schritte","tooComplicatedTooManySteps","thumb-down"],["Nicht mehr aktuell","outOfDate","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Problem mit Beispielen/Code","samplesCodeIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 2025-07-27 (UTC)."],[],[],null,["# Work with MediaPlayer and Digital Rights Management (DRM)\n\nStarting with Android 8.0 (API level 26), [`MediaPlayer`](/reference/android/media/MediaPlayer) includes APIs that\nsupport the playback of DRM-protected material. The MediaPlayer DRM APIs are\nsimilar to the low-level API provided by [`MediaDrm`](/reference/android/media/MediaDrm), but they operate at a\nhigher level and don't expose the underlying extractor, DRM, and crypto objects.\n\nAlthough the MediaPlayer DRM API does not provide the full functionality of\n[`MediaDrm`](/reference/android/media/MediaDrm), it supports the most common use cases. The current\nimplementation can handle the following content types:\n\n- Widevine-protected local media files\n- Widevine-protected remote or streaming media files\n\nThe following code snippet demonstrates how to use the new DRM `MediaPlayer`\nmethods in a synchronous implementation.\n\nTo manage DRM-controlled media, you need to include the new methods alongside\nthe usual flow of MediaPlayer calls, as shown in this example: \n\n### Kotlin\n\n mediaPlayer?.apply {\n setDataSource()\n setOnDrmConfigHelper() // optional, for custom configuration\n prepare()\n drmInfo?.also {\n prepareDrm()\n getKeyRequest()\n provideKeyResponse()\n }\n\n // MediaPlayer is now ready to use\n start()\n // ...play/pause/resume...\n stop()\n releaseDrm()\n }\n\n### Java\n\n setDataSource();\n setOnDrmConfigHelper(); // optional, for custom configuration\n prepare();\n if (getDrmInfo() != null) {\n prepareDrm();\n getKeyRequest();\n provideKeyResponse();\n }\n\n // MediaPlayer is now ready to use\n start();\n // ...play/pause/resume...\n stop();\n releaseDrm();\n\nStart by initializing the [`MediaPlayer`](/reference/android/media/MediaPlayer) object and setting its source using\n[`setDataSource()`](/reference/android/media/MediaPlayer#setDataSource(android.content.Context,%20android.net.Uri)), as usual. Then, to use DRM, perform these steps:\n\n1. If you want your app to perform custom configuration, define an [`OnDrmConfigHelper`](/reference/android/media/MediaPlayer.OnDrmConfigHelper) interface, and attach it to the player using [`setOnDrmConfigHelper()`](/reference/android/media/MediaPlayer#setOnDrmConfigHelper(android.media.MediaPlayer.OnDrmConfigHelper)).\n2. Call [`prepare()`](/reference/android/media/MediaPlayer#prepare()).\n3. Call [`getDrmInfo()`](/reference/android/media/MediaPlayer#getDrmInfo()). If the source has DRM content, the method returns a non-null [`MediaPlayer.DrmInfo`](/reference/android/media/MediaPlayer.DrmInfo) value.\n\nIf [`MediaPlayer.DrmInfo`](/reference/android/media/MediaPlayer.DrmInfo) exists:\n\n1. Examine the map of available UUIDs and choose one.\n2. Prepare the DRM configuration for the current source by calling [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)).\n - If you created and registered an [`OnDrmConfigHelper`](/reference/android/media/MediaPlayer.OnDrmConfigHelper) callback, it is called while [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)) is executing. This lets you perform custom configuration of the DRM properties before opening the DRM session. The callback is called synchronously in the thread that called [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)). To access the DRM properties, call [`getDrmPropertyString()`](/reference/android/media/MediaPlayer#getDrmPropertyString(java.lang.String)) and [`setDrmPropertyString()`](/reference/android/media/MediaPlayer#setDrmPropertyString(java.lang.String,%20java.lang.String)). Avoid performing lengthy operations.\n - If the device has not yet been provisioned, [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)) also accesses the provisioning server to provision the device. This can take a variable amount of time, depending on the network connectivity.\n3. To get an opaque key request byte array to send to a license server, call [`getKeyRequest()`](/reference/android/media/MediaPlayer#getKeyRequest(byte%5B%5D,%20byte%5B%5D,%20java.lang.String,%20int,%20java.util.Map%3Cjava.lang.String,%20java.lang.String%3E)).\n4. To inform the DRM engine about the key response received from the license server, call [`provideKeyResponse()`](/reference/android/media/MediaPlayer#provideKeyResponse(byte%5B%5D,%20byte%5B%5D)). The result depends on the type of key request:\n - If the response is for an offline key request, the result is a key-set identifier. You can use this key-set identifier with [`restoreKeys()`](/reference/android/media/MediaPlayer#restoreKeys(byte%5B%5D)) to restore the keys to a new session.\n - If the response is for a streaming or release request, the result is null.\n\nPrepare DRM asynchronously\n--------------------------\n\nBy default, [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)) runs synchronously, blocking until preparation\nfinishes. However, the very first DRM preparation on a new device may also\nrequire provisioning, which [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)) handles internally, and may take\nsome time to finish due to the network operation involved. You can avoid\nblocking on [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)) by defining and setting a\n[`MediaPlayer.OnDrmPreparedListener`](/reference/android/media/MediaPlayer.OnDrmPreparedListener).\n\nSet an [`OnDrmPreparedListener`](/reference/android/media/MediaPlayer.OnDrmPreparedListener). [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)) performs the\nprovisioning (if needed) and preparation in the background. When provisioning\nand preparation finish, the system calls the listener. Don't make any\nassumptions about the calling sequence or the thread in which the listener runs\n(unless you register the listener with a handler thread). The system can call\nthe listener before or after [`prepareDrm()`](/reference/android/media/MediaPlayer#prepareDrm(java.util.UUID)) returns.\n\nSet up DRM asynchronously\n-------------------------\n\nYou can initialize the DRM asynchronously by creating and registering the\n[`MediaPlayer.OnDrmInfoListener`](/reference/android/media/MediaPlayer.OnDrmInfoListener) for DRM preparation and the\n[`MediaPlayer.OnDrmPreparedListener`](/reference/android/media/MediaPlayer.OnDrmPreparedListener) to start the player. They work in\nconjunction with [`prepareAsync()`](/reference/android/media/MediaPlayer#prepareAsync()), as shown in this example: \n\n### Kotlin\n\n setOnPreparedListener()\n setOnDrmInfoListener()\n setDataSource()\n prepareAsync()\n // ...\n\n // If the data source content is protected you receive a call to the onDrmInfo() callback.\n override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {\n mediaPlayer.apply {\n prepareDrm()\n getKeyRequest()\n provideKeyResponse()\n }\n }\n\n // When prepareAsync() finishes, you receive a call to the onPrepared() callback.\n // If there is a DRM, onDrmInfo() sets it up before executing this callback,\n // so you can start the player.\n override fun onPrepared(mediaPlayer: MediaPlayer) {\n mediaPlayer.start()\n }\n\n### Java\n\n setOnPreparedListener();\n setOnDrmInfoListener();\n setDataSource();\n prepareAsync();\n // ...\n\n // If the data source content is protected you receive a call to the onDrmInfo() callback.\n onDrmInfo() {\n prepareDrm();\n getKeyRequest();\n provideKeyResponse();\n }\n\n // When prepareAsync() finishes, you receive a call to the onPrepared() callback.\n // If there is a DRM, onDrmInfo() sets it up before executing this callback,\n // so you can start the player.\n onPrepared() {\n\n start();\n }\n\nHandle encrypted media\n----------------------\n\nStarting with Android 8.0 (API level 26) `MediaPlayer` can also decrypt Common\nEncryption Scheme (CENC) and HLS sample-level encrypted media\n(METHOD=SAMPLE-AES) for the elementary stream types H.264, and AAC. Full-segment\nencrypted media (METHOD=AES-128) was previously supported.\n\nLearn more\n----------\n\nJetpack Media3 is the recommended solution for media playback in your app. [Read\nmore](/media/media3) about it.\n\nThese pages cover topics relating to recording, storing, and playing back audio\nand video:\n\n- [Supported Media Formats](/guide/topics/media/media-formats)\n- [MediaRecorder](/guide/topics/media/mediarecorder)\n- [Data Storage](/guide/topics/data/data-storage)"]]