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 yararlı olabilir. Örneğin, oynatıcı ve medya oturumu, kullanıcı arayüzündeki 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
kullanma
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 bir MediaController
üzerinde play()
çağrısı yapıldığında komut, bağlı MediaSession
'ye gönderilir. MediaSession
de komutu alttaki Player
'a iletir.
Player
durumundaki değişiklikleri dinlemek için kumandaya bir Player.Listener
ekleyebilirsiniz. Player.Listener
kullanma hakkında daha fazla bilgi için Oynatıcı etkinlikleri kılavuzunu inceleyin.
MediaController.Listener
arayüzü, bağlı MediaSession
'dan gelen etkinlikler ve özel komutlar için ek geri çağırma işlevleri tanımlar. Örneğin, oturum özel bir komut gönderdiğinde onCustomCommand()
, oturum mevcut oturum komutlarını değiştirdiğinde onAvailableSessionCommandsChanged()
veya denetleyicinin oturumla bağlantısı kesildiğinde onDisconnected()
.
Denetleyiciyi Builder
ile oluştururken MediaController.Listener
ayarlanabilir:
Kotlin
MediaController.Builder(context, sessionToken)
.setListener(
object : MediaController.Listener {
override fun onCustomCommand(
controller: MediaController,
command: SessionCommand,
args: Bundle,
): ListenableFuture<SessionResult> {
// Handle custom command.
return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
}
override fun onDisconnected(controller: MediaController) {
// Handle disconnection.
}
}
)
.buildAsync()
Java
new MediaController.Builder(context, sessionToken)
.setListener(
new MediaController.Listener() {
@Override
public ListenableFuture<SessionResult> onCustomCommand(
MediaController controller, SessionCommand command, Bundle args) {
// Handle custom command.
return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
}
@Override
public void onDisconnected(MediaController controller) {
// Handle disconnection.
}
})
.buildAsync();
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 yine de gönderilmesini sağlar 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
, 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());
Başka bir medya uygulamasının oynatma kontrollerini gösterme
Başka bir medya uygulamasının düğmelerini içeren kullanıcı arayüzü denetimlerini gösterirken söz konusu uygulamanın belirtilen medya düğmesi tercihlerine uymanız önemlidir.
Uygulamanın tercihlerini, kullanıcı arayüzünüzün kısıtlamalarını ve şartlarını çözmenin en iyi yolu CommandButton.DisplayConstraints
kullanmaktır. Kullanıcı arayüzünüzün yapabileceği sınırlamaları ve kısıtlamaları tanımlayabilirsiniz. resolve
yöntemi, simgeleriyle, konumlarıyla ve amaçlanan işlemleriyle birlikte gösterilecek düğmelerin kesin bir listesini sağlar.