MediaPlayer'a genel bakış

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() veya MediaPlayer.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:

  1. Uygulamanızın özel yapılandırma gerçekleştirmesini istiyorsanız OnDrmConfigHelper arayüzüne gidip, kullanan oynatıcı setOnDrmConfigHelper().
  2. Şu numaraya telefon et: prepare().
  3. Şu numaraya telefon et: getDrmInfo(). Kaynakta DRM varsa içerik, yöntem, null olmayan bir MediaPlayer.DrmInfo değer.

MediaPlayer.DrmInfo mevcutsa:

  1. Mevcut UUID'lerin haritasını inceleyin ve birini seçin.
  2. 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ı olarak prepareDrm() Alıcı: DRM özelliklerine erişebilir, getDrmPropertyString() ve setDrmPropertyString(). 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.
  3. Lisans sunucusuna gönderilecek bir opak anahtar isteği bayt dizisi almak için şu komutu çalıştırın: getKeyRequest()
  4. 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.

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.