عرض المحتوى باستخدام MediaLibraryService

غالبًا ما تحتوي تطبيقات الوسائط على مجموعات من عناصر الوسائط التي يتم تنظيمها في تسلسل هرمي. على سبيل المثال، الأغاني من ألبوم أو حلقات تلفزيونية في قائمة تشغيل يُعرف هذا التسلسل الهرمي لعناصر الوسائط باسم مكتبة الوسائط.

أمثلة على محتوى الوسائط مرتبة في تسلسل هرمي
الشكل 1: أمثلة على التسلسلات الهرمية لعناصر الوسائط التي تشكِّل مكتبة وسائط.

توفّر MediaLibraryService واجهة برمجة تطبيقات موحّدة لعرض مكتبة الوسائط الخاصة بك والوصول إليها. وقد يكون ذلك مفيدًا مثلاً عند إضافة دعم 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

تتوقّع واجهة برمجة التطبيقات MediaLibraryService أن تكون مكتبة الوسائط منظّمة في تنسيق شجرة مع عقدة جذرية واحدة وعُقد ثانوية يمكن أن تكون قابلة للتشغيل أو قابلة للتصفّح بشكل أكبر.

تعمل MediaLibrarySession على توسيع واجهة برمجة تطبيقات MediaSession لإضافة واجهات برمجة تطبيقات تصفُّح المحتوى. بالمقارنة مع MediaSession معاودة الاتصال، تضيف MediaLibrarySession طرقًا مثل:

  • onGetLibraryRoot() عندما يطلب العميل جذر MediaItem لشجرة محتوى
  • onGetChildren() عندما يطلب العميل عناصر MediaItem في شجرة المحتوى
  • onGetSearchResult() عندما يطلب العميل نتائج البحث من شجرة المحتوى لطلب بحث معين

وستتضمّن طرق معاودة الاتصال ذات الصلة عنصر LibraryParams مع إشارات إضافية حول نوع شجرة المحتوى الذي يهتم به تطبيق العميل.