Android multimedya çerçevesi çeşitli medya türlerini oynatma desteği içerir.
ses, video ve görüntüleri uygulamalarınıza kolayca entegre edebilirsiniz. Ses çalabilir veya
uygulamanızın kaynaklarında (ham kaynaklar) depolanan medya dosyalarındaki bağımsız dosyalardaki video
veya ağ bağlantısı üzerinden gelen bir veri akışından gelen ya da MediaPlayer
API'leri kullanılarak oluşturulan verilerdir.
Bu belgede, DMAIC ve PDCA gibi
Medya oynatma metni yazmak için MediaPlayer
kullanıcı ve sistemle etkileşime giren bir uygulamadır. Bu, uygulamanızın iyi bir performans
ve hoş bir kullanıcı deneyimi sunmak. Alternatif olarak
Google Play, özelleştirilebilir açık kaynak olan ExoPlayer'ı kullanmak için
MediaPlayer
sürümünde bulunmayan, yüksek performanslı özellikleri destekleyen kitaplık
Not: Ses verilerini yalnızca standart çıkışta oynatabilirsiniz. olanak tanır. Bu cihaz, mobil cihaz hoparlörü veya Bluetooth mikrofonlu kulaklıktır. Ses çalamazsınız konuşmaya dahil edebilirsiniz.
Temel bilgiler
Aşağıdaki sınıflar, Android çerçevesinde ses ve video oynatmak için kullanılır:
MediaPlayer
- Bu sınıf, ses ve video oynatmaya yönelik birincil API'dir.
AudioManager
- Bu sınıf, bir cihazdaki ses kaynaklarını ve ses çıkışını yönetir.
Manifest beyanları
MediaPlayer'ı kullanarak uygulamanızda geliştirmeye başlamadan önce manifest dosyanızın ilgili özelliklerin kullanımına izin vermek için uygun beyanları içermelidir.
- İnternet İzni: Ağ tabanlı yayın yapmak için MediaPlayer kullanıyorsanız
ağ erişimi istemesi gerekir.
<uses-permission android:name="android.permission.INTERNET" />
- Uyanık kalma kilidi izni: Oynatıcı uygulamanızın ekranı tutması gerekiyorsa
veya işlemcinin uyku moduna geçmesini engeller ya da
MediaPlayer.setScreenOnWhilePlaying()
veyaMediaPlayer.setWakeMode()
yöntemleri için bu izni istemelisiniz.<uses-permission android:name="android.permission.WAKE_LOCK" />
MediaPlayer'ı kullanma
Medya çerçevesinin en önemli bileşenlerinden biri
MediaPlayer
.
sınıfını kullanır. Bu sınıftaki bir nesne hem sesi hem de videoyu getirebilir, oynatabilir ve bunların kodunu çözebilir
kurulum olanağı sunar. Aşağıdakiler gibi birçok farklı medya kaynağını destekler:
- Yerel kaynaklar
- İçerik Çözücü'den edinebileceğiniz gibi dahili URI'ler
- Harici URL'ler (akış)
Android'in desteklediği medya biçimlerinin listesi için Desteklenen Medya Biçimler sayfasını ziyaret edin.
Bir örnekle açıklayalım
yerel ham kaynak olarak kullanılabilen sesin nasıl çalınacağı (uygulamanızın
res/raw/
dizini):
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1) mediaPlayer.start() // no need to call prepare(); create() does that for you
Java
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); mediaPlayer.start(); // no need to call prepare(); create() does that for you
Bu örnekte, kaynak, sistem tarafından kontrol edilmeyen bir şekilde ayrıştırmaya çalışın. Ancak bu kaynağın içeriği ham ses olmamalıdır. Düzgün kodlanmış ve biçimlendirilmiş bir medya dosyası, seçeneğini de sunar.
Sistemde yerel olarak bulunan bir URI'dan şu şekilde oynatabilirsiniz: (örneğin, bir İçerik Çözücü aracı aracılığıyla edindiğiniz):
Kotlin
val myUri: Uri = .... // initialize Uri here val mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(applicationContext, myUri) prepare() start() }
Java
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
HTTP akışı aracılığıyla uzak bir URL'den oynatma şu şekilde görünür:
Kotlin
val url = "http://........" // your URL here val mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(url) prepare() // might take long! (for buffering, etc) start() }
Java
String url = "http://........"; // your URL here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); // might take long! (for buffering, etc) mediaPlayer.start();
Not: Çevrimiçi bir medya dosyası akışı gerçekleştirmek için bir URL iletiyorsanız dosya progresif indirme.
Dikkat: Yakalamanız veya geçmeniz gerekir
IllegalArgumentException
ve IOException
kullanılırken
setDataSource()
, çünkü
başvuruda bulunduğunuz dosya mevcut olmayabilir.
Eşzamansız hazırlık
MediaPlayer
kullanımı kolay
gösteriyoruz. Ancak, dikkat edilmesi gereken birkaç noktanın daha
tipik bir Android uygulamasıyla doğru şekilde entegre etmek için gereklidir. Örneğin,
Örneğin, prepare()
uygulanması uzun sürer çünkü
medya verilerinin getirilmesini ve kodunun çözülmesini içerebilir. Tüm projelerde olduğu gibi
yöntemi kullanıyorsanız hiçbir zaman bu yöntemi
kullanıcı arayüzü iş parçacığı. Bu, yöntem geri gelene kadar kullanıcı arayüzünün beklemesine neden olur.
Bu da çok kötü bir kullanıcı deneyimi oluşturur ve ANR (Uygulama Yanıt Vermiyor) hatasına neden olabilir. Hatta
kaynağınızın hızlı bir şekilde yüklenmesini bekliyorsanız, onunda onda bir veya daha fazla
bir saniyenin olması, kullanıcı arayüzünde yanıt vermede önemli bir duraklamaya neden olur ve
kullanıcıya uygulamanızın yavaş olduğu izlenimi verir.
Kullanıcı arayüzü iş parçacığınızı asılı kalmamak için
MediaPlayer
öğesini hazırlayın ve tamamlandığında ana ileti dizisini bilgilendirin. Ancak,
iş parçacığı mantığını kullanarak
Bu şablon, MediaPlayer
kullanılırken çerçevenin o kadar yaygın ki
kullanımı kolay bir yol sağlayan
prepareAsync()
yöntemini çağırın. Bu yöntem
arka planda hazırlamaya başlar ve
hemen geri döner. Medya içeriği
onPrepared()
için hazırlık tamamlandı.
MediaPlayer.OnPreparedListener
yöntemi,
setOnPreparedListener()
çağrıldı.
Eyalet yönetiliyor
MediaPlayer
ile ilgili dikkat etmeniz gereken bir diğer nokta da
durum temelli olduğunu
fark edeceksiniz. Yani MediaPlayer
öğesinin bir dahili durumu vardır
bazı işlemler vardır, çünkü kodunuzu yazarken her zaman
yalnızca oynatıcı belirli durumlarda olduğunda geçerlidir. Araçtayken bir işlem gerçekleştirirseniz
sistem bir istisna uygulayabilir veya istenmeyen başka davranışlara neden olabilir.
Belgenin
MediaPlayer
sınıfı eksiksiz bir durum diyagramı gösterir.
MediaPlayer
öğesini bir durumdan diğerine hangi yöntemlerin taşıdığını açıklar.
Örneğin, yeni bir MediaPlayer
oluşturduğunuzda bu öğe Boşta'dadır.
durumu. Bu noktada, şu numarayı çağırarak başlatmalısınız:
setDataSource()
, getiriyor
Başlatıldı durumuna getirin. Daha sonra,
prepare()
veya
prepareAsync()
yöntemini çağırın. Zaman
MediaPlayer
öğesinin hazırlığı bitince Hazır durumuna geçer.
yani start()
numaralı telefonu arayabilirsiniz.
medya içeriği oynatmasını sağlıyor. Bu noktada, diyagramda gösterildiği gibi,
Başlatıldı, Duraklatıldı ve Oynatma Tamamlandı durumları arasında geçiş yapmak üzere
çağırmak için
start()
,
pause()
ve
seekTo()
,
başka özellikler de var. Google Takvim widget'ını
stop()
araması yaparsanız,
şu zamana kadar start()
adlı kişiyi tekrar arayamazsınız
MediaPlayer
tekrar hazırlayın.
Durum diyagramını her zaman koruyun
etkileşimde bulunan bir kod yazarken
MediaPlayer
nesnesidir, çünkü yöntemlerinin yanlış durumdan çağrılması
yaygın bir nedeni var.
MediaPlayer'ı yayınlama
MediaPlayer
değerli şeyler tüketebilir
sistem kaynakları.
Bu nedenle, kötü amaçlı yazılımdan uzak durmak için her zaman
gerekenden daha uzun süre bir MediaPlayer
örneğinde takılı kalıyor. Google Takvim widget'ını
bununla ilgili başka bir şey yoksa her zaman
release()
emin olmak için
sistem kaynakları doğru şekilde serbest bırakılır. Örneğin projenin
zamanlamasıyla ilgili
MediaPlayer
kullanıyorsanız ve etkinliğiniz onStop()
numaralı telefona çağrı alıyorsa MediaPlayer
öğesini serbest bırakmanız gerekir.
çünkü
etkinliğiniz etkileşim kurmadığı sırada buna bağlı
kalmanın pek bir anlamı yoktur.
(bir sonraki bölümde ele alınacak olan arka planda medya oynatmıyorsanız)
Etkinliğiniz devam ettirildiğinde veya yeniden başlatıldığında elbette
yeni bir MediaPlayer
oluşturun ve oynatmaya devam etmeden önce tekrar hazırlayın.
MediaPlayer
cihazınızı nasıl serbest bırakmanız ve ardından geçersiz kılmanız gerekir:
Kotlin
mediaPlayer?.release() mediaPlayer = null
Java
mediaPlayer.release(); mediaPlayer = null;
Örnek olarak, aşağıdakilerden biri olmanız durumunda ortaya çıkabilecek
etkinliğiniz durdurulduğunda MediaPlayer
öğesini bırakmayı unuttunuz, ancak bir
yeni bir kod oluşturun. Sizin de bildiğiniz gibi, kullanıcı
ekran yönü (veya cihaz yapılandırmasını başka bir şekilde değiştiren)
sistem bunu, etkinliği (varsayılan olarak) yeniden başlatarak yapar. Böylece
tüketicinin tüm sistem kaynaklarını tüketmesi
cihazı dikey ve yatay arasında döndürür.
yönünü değiştirdiğinizde daha önce hiç istemediğiniz yeni bir MediaPlayer
kullanabilirsiniz. (Çalışma zamanını yeniden başlatma hakkında daha fazla bilgi için Çalışma Zamanı Değişikliklerini İşleme bölümüne bakın.)
Oynamaya devam etmek istediğinizde ne olacağını
"arka plan medyası" kullanıcı etkinliğinizden ayrılsa bile
müzik uygulamasının çalışma biçiminden farklıdır. Bu durumda ihtiyacınız olan şey
Bir Hizmet tarafından kontrol edilen bir MediaPlayer
,
sonraki bölümde ele alınacaktır
MediaPlayer'ı bir hizmette kullanma
Uygulamanız açıkken bile medyalarınızın arka planda oynatılmasını
ekranda değilse, yani kullanıcı ekranda gezinirken oynatmaya devam etmesini istersiniz.
etkileşimde bulunduğunuzda, bunun için
Hizmet ve kontrol
MediaPlayer
örneği alınacak.
Gerekirse
MediaBrowserServiceCompat
hizmetinde bir MediaPlayer ve
farklı bir
Başka bir etkinlikte MediaBrowserCompat
var.
Bu istemci/sunucu kurulumu konusunda dikkatli olmalısınız. Beklentiler var arka plan hizmetinde çalışan bir oynatıcının diğer bahsedeceğim. Uygulamanız bu beklentileri karşılamıyorsa kullanıcı kötü bir deneyim yaşarsınız. Okunanlar Ses Uygulaması Oluşturma inceleyebilirsiniz.
Bu bölümde, bir hizmet içinde uygulandığında MediaPlayer'ın yönetilmesine ilişkin özel talimatlar açıklanmaktadır.
Eşzamansız olarak çalıştırma
Öncelikle, Activity
gibi bunların tümü
Service
, tek bir ileti dizisinde şu tarafından tamamlandı:
Aynı uygulamadan bir etkinlik ve hizmet çalıştırıyorsanız
varsayılan olarak aynı ileti dizisini ("ana ileti dizisi") kullanır. Bu nedenle, hizmetler
gelen niyetleri hızla işleme
ve asla uzun hesaplamalar yapmayın. Yoğunsa
çalışma veya engelleme çağrılarının olması normalse bu görevleri eşzamansız olarak yapmanız gerekir:
veya çerçevenin birçok özelliğini kullanarak
gerçekleştirdiğiniz başka bir iş parçacığı
.
Örneğin, ana iş parçacığınızdan bir MediaPlayer
kullanırken
yerine prepareAsync()
numaralı telefonu aramalısınız
prepare()
ve
MediaPlayer.OnPreparedListener
hazırlık tamamlandığında bilgilendirilmek ve oynamaya başlayabilirsiniz.
Örnek:
Kotlin
private const val ACTION_PLAY: String = "com.example.action.PLAY" class MyService: Service(), MediaPlayer.OnPreparedListener { private var mMediaPlayer: MediaPlayer? = null override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { ... val action: String = intent.action when(action) { ACTION_PLAY -> { mMediaPlayer = ... // initialize it here mMediaPlayer?.apply { setOnPreparedListener(this@MyService) prepareAsync() // prepare async to not block main thread } } } ... } /** Called when MediaPlayer is ready */ override fun onPrepared(mediaPlayer: MediaPlayer) { mediaPlayer.start() } }
Java
public class MyService extends Service implements MediaPlayer.OnPreparedListener { private static final String ACTION_PLAY = "com.example.action.PLAY"; MediaPlayer mediaPlayer = null; public int onStartCommand(Intent intent, int flags, int startId) { ... if (intent.getAction().equals(ACTION_PLAY)) { mediaPlayer = ... // initialize it here mediaPlayer.setOnPreparedListener(this); mediaPlayer.prepareAsync(); // prepare async to not block main thread } } /** Called when MediaPlayer is ready */ public void onPrepared(MediaPlayer player) { player.start(); } }
Eşzamansız hataları işleme
Eşzamanlı işlemlerde hatalar normalde
bir istisnayla veya hata koduyla işaretlenebilir, ancak eşzamansız
başvuru kaynaklarınız için bilgilendirildiğinden
gözden geçirmeye karar verdiniz. MediaPlayer
olması durumunda,
bunu, uygulama etiketleriyle
MediaPlayer.OnErrorListener
ve
MediaPlayer
örneğinizde ayarlamak için:
Kotlin
class MyService : Service(), MediaPlayer.OnErrorListener { private var mediaPlayer: MediaPlayer? = null fun initMediaPlayer() { // ...initialize the MediaPlayer here... mediaPlayer?.setOnErrorListener(this) } override fun onError(mp: MediaPlayer, what: Int, extra: Int): Boolean { // ... react appropriately ... // The MediaPlayer has moved to the Error state, must be reset! } }
Java
public class MyService extends Service implements MediaPlayer.OnErrorListener { MediaPlayer mediaPlayer; public void initMediaPlayer() { // ...initialize the MediaPlayer here... mediaPlayer.setOnErrorListener(this); } @Override public boolean onError(MediaPlayer mp, int what, int extra) { // ... react appropriately ... // The MediaPlayer has moved to the Error state, must be reset! } }
Bir hata oluştuğunda MediaPlayer
Error (Hata) durumuna geçer (
Tam durum diyagramı için MediaPlayer
sınıfı)
ve tekrar kullanmadan önce sıfırlamanız gerekir.
Uyanık kalma kilitlerini kullanma
Medya oynatan uygulamalar tasarlarken arka planda çalışırsa cihaz uyku moduna geçebilir hizmetiniz çalışırken. Çünkü Android sistemi, uyku moduna geçerken sistem herhangi bir cihazı kapatmaya özelliklerini öğrenen dahil, henüz değil. Ancak, hizmetiniz müzik çalıyor veya canlı çalıyorsa çalışmasını engeller.
Hizmetinizin aşağıda listelenen süre: "uyanık kalma kilitlerini" kullanmanız gerekir. Uyanık kalma kilidi, web sitenizi ziyaret ederken özelliğinin çalışmasını sağlayan bir özellik telefon boşta olsa bile kullanılabilir durumda kalır.
Uyarı: Uyanık kalma kilitlerini her zaman dikkatli bir şekilde kullanmalı ve tutmalısınız uzun süre yalnızca gerçekten gerekli olduğu sürece olanak tanır.
MediaPlayer
cihazınız etkinken CPU'nun çalışmaya devam etmesini sağlamak için
MediaPlayer
cihazınızı başlatırken setWakeMode()
yöntemini çağırın. Bunu yaptığınızda,
MediaPlayer
, oyun sırasında belirtilen kilidi korur ve kilidi açar
duraklatıldığında veya durdurulduğunda:
Kotlin
mediaPlayer = MediaPlayer().apply { // ... other initialization here ... setWakeMode(applicationContext, PowerManager.PARTIAL_WAKE_LOCK) }
Java
mediaPlayer = new MediaPlayer(); // ... other initialization here ... mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
Bununla birlikte, bu örnekte elde edilen uyanık kalma kilidi yalnızca CPU'nun uyanık kalmasını garanti eder. Eğer
şurada medya akışı gerçekleştiriyorsunuz:
bir ağ kullanıyorsanız ve kablosuz bağlantı kullanıyorsanız muhtemelen
WifiLock
:
Bunu manuel olarak edinmeniz ve yayınlamanız gerekir. Bu nedenle, önemli bilgileri hazırlamaya
MediaPlayer
için kablosuz ağ kilidini oluşturmanız ve edinmeniz gerekir.
Örnek:
Kotlin
val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager val wifiLock: WifiManager.WifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock") wifiLock.acquire()
Java
WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE)) .createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock"); wifiLock.acquire();
Medyanızı duraklattığınızda veya durdurduğunuzda ya da artık ihtiyacınız olmadığında ağ, kilidi açmanız gerekir:
Kotlin
wifiLock.release()
Java
wifiLock.release();
Temizlik işlemi gerçekleştiriliyor
Daha önce belirtildiği gibi, MediaPlayer
nesnesi önemli miktarda veri kullanabilir
o kadar iyidir ki bunu yalnızca ihtiyacınız olduğu sürece saklamalısınız.
İşiniz bittiğinde release()
. Bu önemli
bu temizlik yöntemini çağırın. Çünkü sistem atık toplama işlemine
çöp toplayıcının MediaPlayer
cihazını geri alması biraz zaman alabilir.
hassas olduğundan ve medyayla ilgili diğer
kaynakların sıkıntısına neden olmadığından.
Bu nedenle, bir hizmet kullanırken her zaman
yayınladığınızdan emin olmak için onDestroy()
yöntem
MediaPlayer
:
Kotlin
class MyService : Service() { private var mediaPlayer: MediaPlayer? = null // ... override fun onDestroy() { super.onDestroy() mediaPlayer?.release() } }
Java
public class MyService extends Service { MediaPlayer mediaPlayer; // ... @Override public void onDestroy() { super.onDestroy(); if (mediaPlayer != null) mediaPlayer.release(); } }
MediaPlayer
içeriğinizi yayınlamak için her zaman başka fırsatlar aramalısınız
mobil cihaz kapandığında da serbest bırakılır. Örneğin, proje yöneticiliği
(örneğin, ses odağını kaybettikten sonra) uzun süre boyunca medya içeriği oynatabilme
mevcut MediaPlayer
sürümünüzü mutlaka serbest bırakmalı ve tekrar oluşturmalısınız
daha sonra.
Diğer yandan, oynatmanın çok kısa bir süre için durdurulmasını bekliyorsanız muhtemelen
Oluşturma ve hazırlamanın ek yükünü önlemek için MediaPlayer
cihazınızı tutun
tekrar.
Dijital Hak Yönetimi (DRM)
MediaPlayer
, Android 8.0 (API düzeyi 26) sürümünden itibaren şunları içeren API'ler içerir:
ve DRM korumalı materyalin oynatılmasını desteklemez. Google Analytics 4'te Google Cloud'un sağladığı alt düzey API'ye
MediaDrm
fakat daha üst düzeyde faaliyet gösteriyor ve
temel ayıklayıcı, drm ve kripto nesnelerini açığa çıkarmanız gerekir.
MediaPlayer DRM API'si, JavaScript'in tüm işlevlerini
MediaDrm
en yaygın kullanım alanlarını destekler. İlgili içeriği oluşturmak için kullanılan
geçerli uygulama aşağıdaki içerik türlerini işleyebilir:
- Widevine korumalı yerel medya dosyaları
- Widevine korumalı uzaktan/akış medya dosyaları
Aşağıdaki kod snippet'i, yeni DRM MediaPlayer'ın nasıl kullanılacağını göstermektedir basit bir eşzamanlı uygulamada desteklenmiş olabilir.
DRM ile kontrol edilen medyayı yönetmek için, DRM'nin kontrolündeki medya ile birlikte yeni aşağıda gösterildiği gibi MediaPlayer çağrılarının normal akışı:
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();
MediaPlayer
nesnesini ve ayarı başlatarak başlayın
setDataSource()
kullanarak kaynaklandığı için
olduğu gibi. Ardından, DRM'yi kullanmak için şu adımları uygulayın:
- Uygulamanızın özel yapılandırma gerçekleştirmesini istiyorsanız
OnDrmConfigHelper
arayüzüne gidip, kullanan oynatıcısetOnDrmConfigHelper()
. - Şu numaraya telefon et:
prepare()
. - Şu numaraya telefon et:
getDrmInfo()
. Kaynakta DRM varsa içerik, yöntem, null olmayan birMediaPlayer.DrmInfo
değer.
MediaPlayer.DrmInfo
mevcutsa:
- Mevcut UUID'lerin haritasını inceleyin ve birini seçin.
prepareDrm()
numaralı telefonu arayarak geçerli kaynağın DRM yapılandırmasını hazırlayın.- Bir
OnDrmConfigHelper
geri arama, çağrıprepareDrm()
ise yürütülüyor. Bu, DRM'nin özel yapılandırmasını gerçekleştirmenize olanak tanır özelliklerini kontrol edin. Geri çağırmaya eş zamanlı olarakprepareDrm()
Alıcı: DRM özelliklerine erişebilir,getDrmPropertyString()
vesetDrmPropertyString()
. Uzun işlemler yapmaktan kaçının. - Cihazın temel hazırlığı henüz yapılmadıysa
prepareDrm()
adlı kullanıcı da Kullanıcı, cihazın temel hazırlığını yapmak üzere temel hazırlık sunucusuna erişir. Bu işlem ağ bağlantısına göre değişebilir. - Lisans sunucusuna gönderilecek bir opak anahtar isteği bayt dizisi almak için şu komutu çalıştırın:
getKeyRequest()
- DRM motorunu, lisans sunucusundan alınan anahtar yanıtı hakkında bilgilendirmek için şu çağrıyı yapın:
provideKeyResponse()
Sonuç, anahtar isteğinin türüne bağlıdır:- Yanıt çevrimdışı bir anahtar isteği içinse sonuç bir anahtar ayarı tanımlayıcısı olur. Tekliflerinizi otomatikleştirmek ve optimize etmek için
anahtarları yeni bir cihaza geri yüklemek için bu anahtar ayarı tanımlayıcıyı
restoreKeys()
ile kabul edilir. - Yanıt bir akış veya yayın isteği içinse sonuç null olur.
- Yanıt çevrimdışı bir anahtar isteği içinse sonuç bir anahtar ayarı tanımlayıcısı olur. Tekliflerinizi otomatikleştirmek ve optimize etmek için
anahtarları yeni bir cihaza geri yüklemek için bu anahtar ayarı tanımlayıcıyı
prepareDrm()
eşzamansız olarak çalıştırılıyor
Varsayılan olarak prepareDrm()
eşzamanlı olarak çalışır ve hazırlık tamamlanana kadar engeller. Ancak,
yeni bir cihazdaki ilk DRM hazırlığı, temel hazırlık da gerektirebilir.
şirket içinde ele alınan
prepareDrm()
ve
İşlemin tamamlanması, ağ işlemi nedeniyle biraz zaman alabilir. Şunları yapabilirsiniz:
şurada engellemeyi engelle:
prepareDrm()
ölçütüne göre
bir MediaPlayer.OnDrmPreparedListener
tanımlama ve ayarlama.
Bir OnDrmPreparedListener
ayarladığınızda,
prepareDrm()
temel hazırlığı (gerekirse) ve hazırlığı arka planda gerçekleştirir. Zaman
ve hazırlık tamamlandığında dinleyici çağrılır. Şunları yapmalısınız:
yapılan arama sırası veya iletişim dizisi hakkında herhangi bir varsayımda
işleyici bir iş parçacığı çalıştırmasına izin vermez (işleyici bir işleyici iş parçacığına kayıtlı değilse).
Dinleyici, görüşme öncesinde veya sonrasında çağrılabilir
prepareDrm()
.
belirtir.
DRM'yi eşzamansız olarak ayarlama
DRM'yi eşzamansız bir şekilde başlatmak için
MediaPlayer.OnDrmInfoListener
DRM hazırlığı ve
Oynatıcıyı başlatmak için MediaPlayer.OnDrmPreparedListener
.
Birlikte çalıştıkları
prepareAsync()
, aşağıda gösterildiği gibi:
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
, şifre çözme işlemini de gerçekleştirebilir
Ortak Şifreleme Şeması (CENC) ve
Temel akış türleri için HLS örnek düzeyinde şifrelenmiş medya (METHOD=ÖRNEK-AES)
H.264 ve AAC'dir. Tam segmentli şifrelenmiş medya (METHOD=AES-128) daha önce destekleniyordu.
İçerik Çözücü'den medya alma
Bir medya oynatıcı uygulamasında yararlı olabilecek başka bir özellik de
kullanıcının cihazında bulunan müzikleri getirme. Bunu, ContentResolver
öğesini harici medya için sorgulayarak yapabilirsiniz:
Kotlin
val resolver: ContentResolver = contentResolver val uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI val cursor: Cursor? = resolver.query(uri, null, null, null, null) when { cursor == null -> { // query failed, handle error. } !cursor.moveToFirst() -> { // no media on the device } else -> { val titleColumn: Int = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE) val idColumn: Int = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID) do { val thisId = cursor.getLong(idColumn) val thisTitle = cursor.getString(titleColumn) // ...process entry... } while (cursor.moveToNext()) } } cursor?.close()
Java
ContentResolver contentResolver = getContentResolver(); Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor cursor = contentResolver.query(uri, null, null, null, null); if (cursor == null) { // query failed, handle error. } else if (!cursor.moveToFirst()) { // no media on the device } else { int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE); int idColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID); do { long thisId = cursor.getLong(idColumn); String thisTitle = cursor.getString(titleColumn); // ...process entry... } while (cursor.moveToNext()); }
Bunu MediaPlayer
ile kullanmak için şunları yapabilirsiniz:
Kotlin
val id: Long = /* retrieve it from somewhere */ val contentUri: Uri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id ) mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(applicationContext, contentUri) } // ...prepare and start...
Java
long id = /* retrieve it from somewhere */; Uri contentUri = ContentUris.withAppendedId( android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(getApplicationContext(), contentUri); // ...prepare and start...
Daha fazla bilgi
Bu sayfalarda, ses ve video kaydetme, depolama ve oynatmayla ilgili konular ele alınmaktadır.