عرض المحتوى باستخدام 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. يحتوي على إشارات إضافية حول نوع شجرة المحتوى الذي يستخدم تطبيق عميل المعنية.