Medya denetleyici, medya uygulamasının oynatmasını sorgulamak ve kontrol etmek için medya oturumuyla etkileşim kurar. Media3'te MediaController
API'si Player
arayüzünü uygular. Medya denetleyici kullanan istemci uygulamalarına örnek olarak şunlar verilebilir:
- Android sistem medya kontrolleri
- Android Wear OS tamamlayıcı uygulaması
- Android Auto ve Automotive OS
- Google Asistan gibi sesli asistanlar
- Medya Denetleyici Test uygulaması
Medya denetleyici, medya uygulamasında da faydalı olabilir. Örneğin, oynatıcı ve medya oturumu, kullanıcı arayüzüyle Activity
veya Fragment
'den ayrı bir Service
'te bulunuyorsa.
MediaController
oluşturma
MediaController
oluşturmak için ilgili MediaSession
için bir SessionToken
oluşturarak başlayın. Activity
veya Fragment
'nizin onStart()
yöntemi bu konuda iyi bir başlangıç noktası olabilir.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
Bu SessionToken
'ü kullanarak MediaController
oluşturmak, kumandayı belirli bir oturuma bağlar. Bu işlem eşzamanlı olarak gerçekleşmez. Bu nedenle, sonucu dinlemeniz ve kullanılabilir olduğunda kullanmanız gerekir.
Kotlin
val controllerFuture = MediaController.Builder(context, sessionToken).buildAsync() controllerFuture.addListener({ // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(context, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor());
MediaController
kullanın
MediaController
, Player
arayüzünü uygular. Bu sayede, bağlı MediaSession
cihazının oynatılmasını kontrol etmek için arayüzde tanımlanan komutları kullanabilirsiniz.
Yani MediaController
üzerinde play()
çağrısı yapıldığında komut, bağlı MediaSession
'e gönderilir. MediaSession
de komutu alttaki Player
'a iletir.
Benzer şekilde, Player
durumundaki değişiklikleri dinlemek için kumandaya bir Player.Listener
ekleyebilirsiniz. Player.Listener
kullanma hakkında daha fazla bilgi için Oyuncu etkinlikleri kılavuzunu inceleyin. MediaController.Listener
arayüzü, bağlı MediaSession
'dan gelen etkinlikler ve komutlar için ek geri çağırma işlevleri tanımlar. Örneğin, medya oturumu mevcut oturum komutlarını değiştirdiğinde onAvailableSessionCommandsChanged()
ve denetleyicinin oturumla bağlantısı kesildiğinde onDisconnected()
.
Diğer bileşenlerde olduğu gibi, artık ihtiyaç duyulmadığında MediaController
'yi serbest bırakmayı unutmayın (ör. Activity
veya Fragment
'ın onStop()
yönteminde).
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Denetleyicinin serbest bırakılması, oturuma gönderilen bekleyen tüm komutların gönderilmesine devam eder ve yalnızca bu komutlar işlendikten sonra veya bir zaman aşımı süresinden sonra (hangisi önce gerçekleşirse) oturum hizmetinden bağlantıyı kaldırır.
MediaBrowser
oluşturma ve kullanma
MediaBrowser
, bir medya uygulamasının MediaLibraryService
tarafından sunulan medya kitaplığına göz atmayı da sağlamak için MediaController
tarafından sunulan özelliklerin üzerine inşa edilir.
Kotlin
val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync() browserFuture.addListener({ // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaBrowser> browserFuture = new MediaBrowser.Builder(context, sessionToken).buildAsync(); browserFuture.addListener(() -> { // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor());
Medya uygulamasının içerik kitaplığına göz atmaya başlamak için önce getLibraryRoot()
ile kök düğümü alın:
Kotlin
// Get the library root to start browsing the library tree. val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null) rootFuture.addListener({ // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor())
Java
// Get the library root to start browsing the library tree. ListenableFuture<LibraryResult<MediaItem>> rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null); rootFuture.addListener(() -> { // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor());
Ardından, getChildren()
ile kitaplıktaki bir MediaItem
öğesinin alt öğelerini alarak medya kitaplığında gezinebilirsiniz. Örneğin, MediaItem
kök düğümünün alt öğelerini almak için:
Kotlin
// Get the library root to start browsing the library tree. val childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null) childrenFuture.addListener({ // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor())
Java
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null); childrenFuture.addListener(() -> { // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor());