חיבור לאפליקציית מדיה

בקר מדיה מקיים אינטראקציה עם סשן מדיה כדי לשלוח שאילתות ולשלוט במדיה בהפעלה של האפליקציה. ב-Media3, MediaController API מיישם את הממשק Player. דוגמאות לאפליקציות לקוח שמשתמשות במדיה שלט רחוק כוללים:

בקר מדיה יכול להיות שימושי גם בתוך אפליקציית מדיה, לדוגמה אם נגן ומדיה במצב פעיל ב-Service בנפרד מ-Activity או Fragment בממשק המשתמש.

יצירת MediaController

כדי ליצור MediaController, צריך להתחיל ביצירת SessionToken עבור MediaSession התואם. השיטה onStart() של Activity או Fragment יכול להיות מקום טוב לעשות את זה.

Kotlin

val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.java))

Java

SessionToken sessionToken = 
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

אם משתמשים בSessionToken הזה כדי לבנות MediaController, של בקר בסשן הנתון. התהליך הזה מתרחש באופן אסינכרוני, לכן מקשיבים לתוצאה ומשתמשים בה כשהיא זמינה.

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

MediaController מיישם את הממשק Player, כך שתוכלו להשתמש בפקודות מוגדרת בממשק כדי לשלוט בהפעלה של MediaSession המחובר. זאת אומרת שהתקשרות אל play() במכשיר MediaController תשלח את ל-MediaSession המחובר, שיקבל לאחר מכן את הגישה ל-Player הבסיסי שלו.

באופן דומה, אפשר להוסיף Player.Listener לשלט רחוק כדי להאזין שינויים במצב Player. עיינו ב מדריך בנושא אירועים של שחקנים לפרטים נוספים על השימוש בPlayer.Listener. MediaController.Listener הממשק מגדיר קריאות חוזרות (callbacks) נוספות עבור אירועים ופקודות נכנסות MediaSession מחובר, כמו onAvailableSessionCommandsChanged() למקרים שבהם סשן המדיה משנה את פקודות הסשן הזמינות onDisconnected() כשהבקר מנותק מהסשן.

בדומה לרכיבים אחרים, חשוב לזכור לשחרר את MediaController כשהוא כבר לא נחוץ, למשל, בשיטה onStop() של Activity או Fragment

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

שחרור השלט רחוק עדיין יעביר את כל הפקודות הממתינות שנשלחו אל ורק כאשר לפקודות האלה יש מטופל או לאחר פרק זמן קצוב לתפוגה, המוקדם מביניהם.

יצירת MediaBrowser ושימוש בו

MediaBrowser מתבסס על היכולות שמוצעות MediaController כדי לאפשר גם לעיין בספריית המדיה המוצעת על ידי מדיה MediaLibraryService של האפליקציה.

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());

כדי להתחיל לעיין בספריית התוכן של אפליקציית המדיה, קודם צריך לאחזר את צומת הרמה הבסיסית (root) עם getLibraryRoot():

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());

לאחר מכן אפשר לנווט בספריית המדיה על ידי אחזור הצאצאים של MediaItem בספרייה עם getChildren(). לדוגמה, כדי לאחזר את הצאצאים של צומת השורש MediaItem:

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());