בקר מדיה מקיים אינטראקציה עם סשן מדיה כדי לשלוח שאילתות ולשלוט במדיה
בהפעלה של האפליקציה. ב-Media3, MediaController
API מיישם את הממשק Player
. דוגמאות לאפליקציות לקוח שמשתמשות במדיה
שלט רחוק כוללים:
- פקדי המדיה של מערכת Android
- אפליקציה נלווית ל-Android Wear OS
- Android Auto ו-Automotive OS
- עוזרים קוליים, כמו Google Assistant
- אפליקציית הבדיקה של בקר המדיה
בקר מדיה יכול להיות שימושי גם בתוך אפליקציית מדיה, לדוגמה אם
נגן ומדיה במצב פעיל ב-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());