Medya uygulamasına bağlanmanın iki yolu vardır:
MediaControllerMediaBrowser
MediaController
Medya kumandası, medya uygulamasının oynatmasını sorgulamak ve kontrol etmek için medya oturumuyla etkileşime girer. Media3'te MediaController
API, Player arayüzünü uygular. Medya denetleyicisi 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 Kontrol Cihazı Testi uygulaması
Medya oynatıcı ve medya oturumu, kullanıcı arayüzünden Service ayrı bir Activity veya Fragment içinde yaşıyorsa medya uygulamasında da medya denetleyicisi kullanışlı olabilir.
MediaController oluştur
MediaController oluşturmak için ilgili MediaSession için SessionToken oluşturarak başlayın. onStart() Activity veya
Fragment 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 kullanılarak oluşturulan MediaController, kumandayı verilen oturuma bağlar. Bu işlem eşzamansız olarak gerçekleşir. Bu nedenle, sonucu dinlemeli ve kullanıma sunulduğunda kullanmalısınız.
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ü uyguladığından arayüzde tanımlanan komutları kullanarak bağlı MediaSession cihazının oynatılmasını kontrol edebilirsiniz.
Bu, MediaController üzerinde play() işlevinin çağrılmasının, komutu bağlı MediaSession cihazına göndereceği ve bu cihazın da komutu temel Player cihazına devredeceği anlamına gelir.
Player.Listener durumundaki değişiklikleri dinlemek için denetleyiciye Player ekleyebilirsiniz. Player.Listener kullanma hakkında daha fazla bilgi için oyuncu etkinlikleri kılavuzuna bakın.
MediaController.Listener arayüzü, bağlı MediaSession'den gelen etkinlikler ve özel komutlar için ek geri çağırma işlevlerini tanımlar. Örnekler:
onCustomCommand() Oturum özel bir komut gönderdiğinde,
onAvailableSessionCommandsChanged() Oturum, kullanılabilir oturum komutlarını değiştirdiğinde veya onDisconnected() Kontrol cihazı oturumla bağlantısı kesildiğinde.
Builder ile kumanda oluşturulurken MediaController.Listener ayarlanabilir:
Kotlin
val controllerFuture = 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
ListenableFuture<MediaController> controllerFuture = 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 öğesini serbest bırakmayı unutmayın. Örneğin, Activity veya Fragment öğesinin onStop() yönteminde bu işlemi yapabilirsiniz.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Denetleyicinin serbest bırakılması, oturuma gönderilen tüm bekleyen komutları yine de iletir ve yalnızca bu komutlar işlendikten sonra veya zaman aşımı süresinden sonra (hangisi önce gerçekleşirse) oturum hizmetinin bağlantısını kaldırır.
MediaBrowser
MediaBrowser, MediaController tarafından sunulan özelliklerin üzerine kurulur ve medya uygulamasının MediaLibraryService tarafından sunulan medya kitaplığında gezinmeyi de sağlar.
MediaBrowser oluştur
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());
MediaBrowser kullanın
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, kitaplıktaki MediaItem öğesinin alt öğelerini getChildren() ile alarak medya kitaplığında gezinebilirsiniz. Örneğin, kök düğümün MediaItem 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ı için oynatma kontrollerini gösterme
Başka bir medya uygulaması için düğmeler içeren kullanıcı arayüzü kontrolleri gösterirken bu uygulamanın belirtilen medya düğmesi tercihlerine uymanız önemlidir.
Uygulamanın tercihlerini kullanıcı arayüzünüzün kısıtlamaları ve şartlarıyla eşleştirmek için CommandButton.DisplayConstraints kullanın. Kullanıcı arayüzünüzün yapabileceği sınırları ve kısıtlamaları tanımlayabilirsiniz. resolve yöntemi, simgeleri, konumları ve amaçlanan işlemleriyle birlikte görüntülenecek düğmelerin kesin bir listesini sağlar. Kullanıcı bu düğmelerden birini tıkladığında, medya uygulamasında ilişkili işlemi tetiklemek için CommandButton.executeAction kullanabilirsiniz.
Kotlin
// Get media button preferences from media app val mediaButtonPreferences = controller.getMediaButtonPreferences() // Declare constraints of UI (example: limit overflow button to one) val displayConstraints = DisplayConstraints.Builder().setMaxButtonsForSlot(CommandButton.SLOT_OVERFLOW, 1).build() // Resolve media app preferences with constraints val resolvedButtons = displayConstraints.resolve(mediaButtonPreferences, controller) // Display buttons in UI for (button in resolvedButtons) { generateUiButton( uiPosition = button.slots[0], icon = getIconRes(button.icon), onClick = { button.executeAction(controller) }, ) }
Java
// Get media button preferences from media app List<CommandButton> mediaButtonPreferences = controller.getMediaButtonPreferences(); // Declare constraints of UI (example: limit overflow button to one) DisplayConstraints displayConstraints = new DisplayConstraints.Builder() .setMaxButtonsForSlot(CommandButton.SLOT_OVERFLOW, 1) .build(); // Resolve media app preferences with constraints List<CommandButton> resolvedButtons = displayConstraints.resolve(mediaButtonPreferences, controller); // Display buttons in UI for (CommandButton button : resolvedButtons) { generateUiButton( /* uiPosition= */ button.slots.get(0), /* icon= */ getIconRes(button.icon), /* onClick= */ () -> button.executeAction(controller)); }