הגשת תוכן באמצעות 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 מצפה שספריית המדיה תהיה מובנית בפורמט עץ, עם צומת root יחיד וצמתים צאצאים שאפשר להפעיל או לעיין בהם.

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

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

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