Medya denetleyicisi, 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üyle Service
ayrı bir Activity
veya Fragment
içinde yer alıyorsa medya uygulamasında medya denetleyicisi de kullanışlı olabilir.
MediaController
oluşturma
MediaController
oluşturmak için ilgili MediaSession
için SessionToken
oluşturarak başlayın. onStart()
Activity
veya Fragment
yönteminiz bu işlem için iyi bir yer 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ı söz konusu oturuma bağlar. Bu işlem eşzamansız olarak gerçekleşir. Bu nedenle, sonucu dinlemeniz ve kullanıma sunulduğ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ü uyguladığından arayüzde tanımlanan komutları kullanarak bağlı MediaSession
cihazının oynatılmasını kontrol edebilirsiniz.
Bu, MediaController
üzerinde play()
'ı çağırmanın, komutu bağlı MediaSession
'ye göndereceği ve bu cihazın da komutu temel Player
'üne 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
cihazından 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.
MediaController.Listener
ile kumanda oluşturulurken MediaController.Listener
ayarlanabilir:Builder
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
öğ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 oturum hizmetinden yalnızca bu komutlar işlendikten sonra veya zaman aşımı süresi geçtikten sonra (hangisi önce gerçekleşirse) ayrılır.
MediaBrowser
oluşturma ve kullanma
MediaBrowser
, MediaController
tarafından sunulan özelliklerin üzerine kurulur ve medya uygulamasının MediaLibraryService
tarafından sunulan medya kitaplığında gezinmeyi de sağlar.
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, 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 uymak önemlidir.
Uygulamanın tercihlerini ve kullanıcı arayüzünüzün kısıtlamalarını ve gereksinimlerini çözmenin en iyi yolu CommandButton.DisplayConstraints
kullanmaktır. Kullanıcı arayüzünüzün yapabileceklerinin sınırlarını ve kısıtlamalarını tanımlayabilirsiniz. resolve
yöntemi, simgeleri, konumları ve amaçlanan işlemleriyle birlikte görüntülenecek düğmelerin kesin bir listesini sağlar.