MediaPlayer ve Dijital Hak Yönetimi (DRM) ile çalışma
Koleksiyonlar ile düzeninizi koruyun
İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.
Android 8.0 (API düzeyi 26) sürümünden itibaren MediaPlayer
, DRM korumalı materyallerin oynatılmasını destekleyen API'leri içerir. MediaPlayer DRM API'leri, MediaDrm
tarafından sağlanan düşük düzey API'ye benzer ancak daha yüksek bir düzeyde çalışır ve temel ayıklayıcı, DRM ve kripto nesnelerini göstermez.
MediaPlayer DRM API, MediaDrm
'nin tüm işlevlerini sağlamasa da en yaygın kullanım alanlarını destekler. Mevcut uygulama aşağıdaki içerik türlerini işleyebilir:
- Widevine tarafından korunan yerel medya dosyaları
- Widevine korumalı uzaktan veya akışlı medya dosyaları
Aşağıdaki kod snippet'inde, yeni DRM MediaPlayer
yöntemlerinin senkronize bir uygulamada nasıl kullanılacağı gösterilmektedir.
DRM kontrollü medyayı yönetmek için bu örnekte gösterildiği gibi, MediaPlayer çağrılarının normal akışına yeni yöntemleri eklemeniz gerekir:
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();
Her zamanki gibi MediaPlayer
nesnesini başlatarak ve kaynağını setDataSource()
kullanarak ayarlayarak başlayın. Ardından DRM'yi kullanmak için aşağıdaki adımları uygulayın:
- Uygulamanızın özel yapılandırma yapmasını istiyorsanız bir
OnDrmConfigHelper
arayüzü tanımlayın ve setOnDrmConfigHelper()
kullanarak oynatıcıya ekleyin.
prepare()
numaralı telefonu arayın.
getDrmInfo()
numaralı telefonu arayın. Kaynakta DRM içeriği varsa yöntem, null olmayan bir MediaPlayer.DrmInfo
değeri döndürür.
MediaPlayer.DrmInfo
varsa:
- Mevcut UUID'lerin haritasını inceleyin ve bir UUID seçin.
prepareDrm()
işlevini çağırarak mevcut kaynak için DRM yapılandırmasını hazırlayın.
OnDrmConfigHelper
geri çağırma işlevi oluşturduysanız ve kaydettiyseniz prepareDrm()
işlevi yürütülürken çağrılır. Bu sayede, DRM oturumunu açmadan önce DRM özelliklerini özel olarak yapılandırabilirsiniz. Geri çağırma işlevi, prepareDrm()
işlevini çağıran iş parçacığında eşzamanlı olarak çağrılır. DRM özelliklerine erişmek için getDrmPropertyString()
ve setDrmPropertyString()
işlevlerini çağırın. Uzun işlemler yapmaktan kaçının.
- Cihaz henüz temel hazırlığı yapılmadıysa
prepareDrm()
, cihazın temel hazırlığını yapmak için temel hazırlama sunucusuna da erişir. Bu işlem, ağ bağlantısına bağlı olarak değişen bir süre alabilir.
- Lisans sunucusuna gönderilecek opak anahtar isteği bayt dizisi almak için
getKeyRequest()
işlevini çağırın.
- DRM motorunu, lisans sunucusundan alınan anahtar yanıtı hakkında bilgilendirmek için
provideKeyResponse()
işlevini çağırın. Sonuç, anahtar isteğinin türüne bağlıdır:
- Yanıt, çevrimdışı bir anahtar isteği içinse sonuç bir anahtar grubu tanımlayıcısı olur. Anahtarları yeni bir oturuma geri yüklemek için bu anahtar grubu tanımlayıcısını
restoreKeys()
ile kullanabilirsiniz.
- Yanıt, yayın veya yayın isteği içinse sonuç null olur.
DRM'yi eşzamansız olarak hazırlama
Varsayılan olarak prepareDrm()
eşzamanlı olarak çalışır ve hazırlık tamamlanana kadar engelleme yapar. Ancak yeni bir cihazda ilk DRM hazırlığı için de temel hazırlama gerekebilir. Bu işlem prepareDrm()
tarafından dahili olarak yönetilir ve ilgili ağ işlemi nedeniyle tamamlanması biraz zaman alabilir. MediaPlayer.OnDrmPreparedListener
tanımlayıp ayarlayarak prepareDrm()
'te engellemeyi önleyebilirsiniz.
Bir OnDrmPreparedListener
ayarlayın. prepareDrm()
, temel hazırlığı (gerekirse) ve hazırlığı arka planda gerçekleştirir. Hazırlama ve hazırlık tamamlandığında sistem dinleyiciyi çağırır. Çağrı sırası veya dinleyicinin çalıştığı iş parçacığı hakkında varsayımlarda bulunmayın (dinleyiciyi bir işleyici iş parçacığına kaydettirmediğiniz sürece). Sistem, prepareDrm()
döndükten önce veya sonra dinleyiciyi çağırabilir.
DRM'yi eşzamansız olarak ayarlama
DRM hazırlığı için MediaPlayer.OnDrmInfoListener
ve oynatıcıyı başlatmak için MediaPlayer.OnDrmPreparedListener
öğesini oluşturup kaydederek DRM'yi eşzamansız olarak başlatabilirsiniz. Bu örnekte gösterildiği gibi, prepareAsync()
ile birlikte çalışırlar:
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();
}
Şifrelenmiş medyayı işleme
Android 8.0 (API düzeyi 26) sürümünden itibaren MediaPlayer
, H.264 ve AAC temel akış türleri için Ortak Şifreleme Şeması'nın (CENC) ve HLS örnek düzeyinde şifrelenmiş medyanın (METHOD=SAMPLE-AES) şifresini de çözebilir. Tam segment şifrelenmiş medya (METHOD=AES-128) daha önce destekleniyordu.
Daha fazla bilgi
Uygulamanızda medya oynatma için önerilen çözüm Jetpack Media3'tür. Bu konu hakkında daha fazla bilgi edinin.
Bu sayfalarda ses ve video kaydetme, depolama ve oynatma ile ilgili konular ele alınmaktadır:
Bu sayfadaki içerik ve kod örnekleri, İçerik Lisansı sayfasında açıklanan lisanslara tabidir. Java ve OpenJDK, Oracle ve/veya satış ortaklarının tescilli ticari markasıdır.
Son güncelleme tarihi: 2025-07-27 UTC.
[[["Anlaması kolay","easyToUnderstand","thumb-up"],["Sorunumu çözdü","solvedMyProblem","thumb-up"],["Diğer","otherUp","thumb-up"]],[["İhtiyacım olan bilgiler yok","missingTheInformationINeed","thumb-down"],["Çok karmaşık / çok fazla adım var","tooComplicatedTooManySteps","thumb-down"],["Güncel değil","outOfDate","thumb-down"],["Çeviri sorunu","translationIssue","thumb-down"],["Örnek veya kod sorunu","samplesCodeIssue","thumb-down"],["Diğer","otherDown","thumb-down"]],["Son güncelleme tarihi: 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)"]]