Bu bölümde, bir medya oynatıcı uygulamasının bir medya denetleyicisi (kullanıcı arayüzü için) ve bir medya oturumu (gerçek oynatıcı için) nasıl ayrılacağı açıklanmaktadır. İki medya uygulaması mimarisini açıklar: ses uygulamaları için iyi çalışan bir istemci/sunucu tasarımı ve video oynatıcılar için tek etkinlikli bir tasarım. Ayrıca medya uygulamalarının donanım denetimlerine nasıl yanıt vereceğini ve ses çıkış akışını kullanan diğer uygulamalarla nasıl iş birliği yapacağını gösterir.
Oynatıcı ve kullanıcı arayüzü
Ses veya video oynatan bir multimedya uygulamasının genellikle iki bölümü vardır:
- Dijital medyayı alıp video ve/veya ses olarak işleyen bir oynatıcı.
- Oynatıcıyı çalıştırmak ve isteğe bağlı olarak oyuncunun durumunu görüntülemek için taşıma kontrolleri içeren bir kullanıcı arayüzü
Android'de sıfırdan kendi oynatıcınızı oluşturabilir veya aşağıdaki seçeneklerden birini belirleyebilirsiniz:
- MediaPlayer sınıfı, en yaygın ses/video biçimlerini ve veri kaynaklarını destekleyen sade bir oynatıcı için temel işlevleri sunar.
- ExoPlayer,
MediaCodec
veAudioTrack
gibi alt düzey medya çerçevesi bileşenleri üzerine kurulmuş açık kaynak bir kitaplıktır. ExoPlayer,MediaPlayer
içinde kullanılamayan DASH gibi yüksek performanslı özellikleri destekler. ExoPlayer kodunu özelleştirebilir, yeni bileşenleri kolayca ekleyebilirsiniz. ExoPlayer sadece Android 4.1 ve sonraki sürümleriyle kullanılabilir.
Medya oturumu ve medya denetleyicisi
Kullanıcı arayüzü ve oynatıcı için API'ler rastgele olabilse de iki parça arasındaki etkileşimin doğası tüm medya oynatıcı uygulamaları için temelde aynıdır. Android çerçevesi, bir medya oynatıcı uygulaması oluşturmak için iyi tanımlanmış bir yapı sunan bir medya oturumu ve bir medya denetleyicisi olmak üzere iki sınıf tanımlar.
Medya oturumu ve medya denetleyicisi, standart oynatıcı işlemlerine (oynatma, duraklatma, durdurma vb.) karşılık gelen önceden tanımlanmış geri çağırmaları ve uygulamanıza özgü özel davranışları tanımlamak için kullandığınız genişletilebilir özel çağrıları kullanarak birbirleriyle iletişim kurar.
Medya oturumu
Oynatıcıyla olan tüm iletişimden medya oturumu sorumludur. Oynatıcının API'sini uygulamanızın geri kalanından gizler. Oynatıcı yalnızca onu kontrol eden medya oturumundan çağrılır.
Oturumda, oyuncunun durumu (oynama/duraklatılmış) ve oynatılan içerik hakkında bilgi verilir. Bir oturum, bir veya daha fazla medya denetleyicisinden geri çağırma alabilir. Böylece oynatıcınızın, uygulamanızın kullanıcı arayüzünün yanı sıra Wear OS ve Android Auto'yu çalıştıran tamamlayıcı cihazlar tarafından da kontrol edilebilir. Geri çağırmalara yanıt veren mantık tutarlı olmalıdır. Geri çağırmayı hangi istemci uygulamasının başlattığından bağımsız olarak, MediaSession
geri çağırmanın yanıtı aynı olmalıdır.
Medya denetleyicisi
Kullanıcı arayüzünüz bir medya denetleyicisiyle izole edilir. Kullanıcı arayüzü kodunuz oynatıcının kendisiyle değil, yalnızca medya denetleyicisiyle iletişim kurar. Medya denetleyicisi, aktarım kontrolü işlemlerini medya oturumuna yapılan geri çağırmalara dönüştürür. Ayrıca, oturum durumu her değiştiğinde medya oturumundan geri çağırmalar alır. Bu, ilişkili kullanıcı arayüzünü otomatik olarak güncelleyen bir mekanizma sağlar. Bir medya denetleyicisi aynı anda yalnızca bir medya oturumuna bağlanabilir.
Bir medya denetleyicisi ve bir medya oturumu kullandığınızda, çalışma zamanında farklı arayüzler ve/veya oynatıcılar dağıtabilirsiniz. Uygulamanızın görünümünü ve/veya performansını, çalıştığı cihazın özelliklerine bağlı olarak bağımsız olarak değiştirebilirsiniz.
Video uygulamaları ve ses uygulamaları karşılaştırması
Video oynatırken hem gözleriniz hem de kulaklarınız çalışır. Ses çalarken dinliyorsunuzdur, ancak aynı anda farklı bir uygulamayla da çalışabilirsiniz. Her kullanım alanı için farklı bir tasarım vardır.
Video uygulaması
Video uygulamasında içerik görüntülemek için pencere gerekir. Bu nedenle, video uygulamaları genellikle tek bir Android etkinliği olarak uygulanır. Videonun göründüğü ekran etkinliğin bir parçasıdır.
Ses uygulaması
Bir ses çaların kullanıcı arayüzünün her zaman görünür olması gerekmez. Oynatıcı ses çalmaya başladıktan sonra arka plan görevi olarak çalışabilir. Kullanıcı başka bir uygulamaya geçebilir ve dinlemeye devam edebilir.
Bu tasarımı Android'de uygulamak için iki bileşeni kullanarak bir ses uygulaması oluşturabilirsiniz: kullanıcı arayüzü için bir etkinlik ve oynatıcı için bir hizmet. Kullanıcı başka bir uygulamaya geçerse hizmet arka planda çalışabilir. Bir ses uygulamasının iki parçasını ayrı bileşenlere ayırarak her biri kendi başına daha verimli çalışabilir. Kullanıcı arayüzü, bir oynatıcıya kıyasla genellikle kısa ömürlüdür ve kullanıcı arayüzü olmadan uzun süre çalışabilir.
Destek kitaplığı, bu istemci/sunucu yaklaşımını uygulamak için iki sınıf sağlar: MediaBrowserService
ve MediaBrowser
. Hizmet bileşeni, medya oturumunu ve oynatıcısını içeren bir MediaBrowserService
alt sınıfı olarak uygulanır. Kullanıcı arayüzü ve medya denetleyicisiyle gerçekleşen etkinlik, MediaBrowserService
ile iletişim kuran bir MediaBrowser
içermelidir.
MediaBrowserService
kullanımı, tamamlayıcı cihazların (Android Auto ve Wear gibi) uygulamanızın kullanıcı arayüzü etkinliğine hiçbir şekilde erişmeden uygulamanızı keşfetmesini, bağlanmasını, içeriklere göz atmasını ve oynatmayı kontrol etmesini kolaylaştırır. Aslında, aynı anda aynı MediaBrowserService
hesabına bağlı birden çok uygulama olabilir ve her uygulamanın kendi MediaController
'ı vardır. MediaBrowserService
sunan bir uygulama, aynı anda birden fazla bağlantıyı işleyebilir.
Medya uygulamaları ve Android ses altyapısı
İyi tasarlanmış bir medya uygulaması, ses çalan diğer uygulamalarla "birlikte iyi performans göstermelidir". Telefonu paylaşmaya ve cihazınızdaki ses kullanan diğer uygulamalarla iş birliği yapmaya hazır olmalıdır. Ayrıca cihazdaki donanım kontrollerine de yanıt vermelidir.
Tüm bu davranışlar Ses Çıkışını Kontrol Etme bölümünde açıklanmıştır.
Medya uyumlu kitaplığı
media-compat kitaplığında ses ve video oynatan uygulamalar geliştirmek için yararlı sınıflar bulunur. Bu sınıflar, Android 2.3 (API düzeyi 9) ve sonraki sürümleri çalıştıran cihazlarla uyumludur. Ayrıca rahat, tanıdık bir Android deneyimi oluşturmak için diğer Android özellikleriyle birlikte çalışırlar.
Medya oturumları ve medya denetleyicileri için önerilen uygulama, medya uyumluluğu destek kitaplığında tanımlanmış MediaSessionCompat
ve MediaControllerCompat
sınıflarıdır. Bu uygulamalar, Android 5.0'da (API düzeyi 21) kullanıma sunulan MediaSession
ve MediaController
sınıflarının önceki sürümlerinin yerini alır. Uyumlu sınıflar da aynı işlevi sunar, ancak yalnızca bir API'ye yazmanız gerektiği için uygulamanızı geliştirmenizi kolaylaştırır. Kitaplık, kullanılabilir olduğunda medya oturumu yöntemlerini eski platform sürümlerindeki eşdeğer yöntemlere çevirerek geriye dönük uyumluluğu sağlar.
Eski sınıfları kullanan ve çalışan bir uygulamanız zaten varsa uyumlu sınıflara güncelleme yapmanızı öneririz. Uyumlu sürümleri kullandığınızda registerMediaButtonReceiver()
için yapılan tüm çağrıları ve diğer yöntemleri RemoteControlClient
ürününden kaldırabilirsiniz.
Performansı ölçme
Android 8.0 (API düzeyi 26) ve sonraki sürümlerde bazı medya sınıfları için getMetrics()
yöntemi kullanılabilir. Özellikler ve değerlerin haritası olarak ifade edilen, yapılandırma ve performans bilgilerini içeren bir PersistableBundle
nesnesi döndürür.
getMetrics()
yöntemi, şu medya sınıfları için tanımlanır:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Metrikler her örnek için ayrı ayrı toplanır ve örneğin ömrü boyunca devam eder. Herhangi bir metrik yoksa yöntem null değerini döndürür. Döndürülen gerçek metrikler sınıfa bağlıdır.