הגשת תוכן באמצעות MediaLibraryService

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

דוגמאות לתוכן מדיה שמסודר בהיררכיה
איור 1: דוגמאות להיררכיות של פריטי מדיה ספריית המדיה.

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

הרכבת MediaLibraryService

ההטמעה של MediaLibraryService דומה להטמעה של הטמעה של MediaSessionService, חוץ מזה, בשיטה onGetSession(), הפונקציה מחזירה MediaLibrarySession במקום MediaSession.

Kotlin

class PlaybackService : MediaLibraryService() {
  var mediaLibrarySession: MediaLibrarySession? = null
  var callback: MediaLibrarySession.Callback = object : MediaLibrarySession.Callback {...}

  // If desired, validate the controller before returning the media library session
  override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaLibrarySession? =
    mediaLibrarySession

  // Create your player and media library session in the onCreate lifecycle event
  override fun onCreate() {
    super.onCreate()
    val player = ExoPlayer.Builder(this).build()
    mediaLibrarySession = MediaLibrarySession.Builder(this, player, callback).build()
  }

  // Remember to release the player and media library session in onDestroy
  override fun onDestroy() {
    mediaLibrarySession?.run { 
      player.release()
      release()
      mediaLibrarySession = null
    }
    super.onDestroy()
  }
}

Java

class PlaybackService extends MediaLibraryService {
  MediaLibrarySession mediaLibrarySession = null;
  MediaLibrarySession.Callback callback = new MediaLibrarySession.Callback() {...};

  @Override
  public MediaLibrarySession onGetSession(MediaSession.ControllerInfo controllerInfo) {
    // If desired, validate the controller before returning the media library session
    return mediaLibrarySession;
  }

  // Create your player and media library session in the onCreate lifecycle event
  @Override
  public void onCreate() {
    super.onCreate();
    ExoPlayer player = new ExoPlayer.Builder(this).build();
    mediaLibrarySession = new MediaLibrarySession.Builder(this, player, callback).build();
  }

  // Remember to release the player and media library session in onDestroy
  @Override
  public void onDestroy() {
    if (mediaLibrarySession != null) {
      mediaLibrarySession.getPlayer().release();
      mediaLibrarySession.release();
      mediaLibrarySession = null;
    }
    super.onDestroy();
  }
}

חשוב להצהיר על Service ועל ההרשאות הנדרשות בקובץ המניפסט וגם:

<service
    android:name=".PlaybackService"
    android:foregroundServiceType="mediaPlayback"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.media3.session.MediaSessionService"/>
    </intent-filter>
</service>

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- For targetSdk 34+ -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />

שימוש ב-MediaLibrarySession

ה-API של MediaLibraryService מצפה שספריית המדיה שלך תהיה בנויה בפורמט של עץ, עם צומת בסיס אחד וצומתי צאצא שעשויים להיות משחקייה או פתוח לעיון.

MediaLibrarySession מרחיב את ממשק ה-API של MediaSession כדי להוסיף ממשקי API לגלישה בתוכן. בהשוואה ל- MediaSession התקשרות חזרה, הקריאה החוזרת MediaLibrarySession מוסיפה שיטות כמו:

  • onGetLibraryRoot() למקרים שבהם לקוח מבקש את הרמה הבסיסית (root) MediaItem של עץ תוכן
  • onGetChildren() למקרים שבהם לקוח מבקש מהצאצאים של MediaItem בעץ התוכן
  • onGetSearchResult() למקרים שבהם לקוח מבקש תוצאות חיפוש מעץ התוכן שאילתה

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