ارائه محتوا با MediaLibraryService

برنامه های رسانه اغلب حاوی مجموعه ای از آیتم های رسانه ای هستند که در یک سلسله مراتب سازماندهی شده اند. به عنوان مثال، آهنگ های یک آلبوم یا قسمت های تلویزیونی در یک لیست پخش. این سلسله مراتب از آیتم های رسانه ای به عنوان کتابخانه رسانه ای شناخته می شود.

نمونه هایی از محتوای رسانه ای که در یک سلسله مراتب مرتب شده اند
شکل 1 : نمونه هایی از سلسله مراتب آیتم های رسانه ای که یک کتابخانه رسانه ای را تشکیل می دهند.

MediaLibraryService یک API استاندارد برای سرویس دهی و دسترسی به کتابخانه رسانه شما فراهم می کند. این می تواند مفید باشد، به عنوان مثال، هنگام افزودن پشتیبانی از Android Auto به برنامه رسانه خود، که رابط کاربری امن برای درایور خود را برای کتابخانه رسانه شما فراهم می کند.

یک MediaLibraryService بسازید

پیاده سازی MediaLibraryService شبیه اجرای MediaSessionService است، با این تفاوت که در متد onGetSession() باید به جای MediaSession یک MediaLibrarySession برگردانید.

کاتلین

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()
  }
}

جاوا

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 API انتظار دارد که کتابخانه رسانه شما در قالب درختی، با یک گره ریشه واحد و گره‌های فرزند که ممکن است قابل پخش یا مرور بیشتر باشند، ساخته شود.

MediaLibrarySession API MediaSession را برای افزودن APIهای مرور محتوا گسترش می دهد. در مقایسه با فراخوان MediaSession ، MediaLibrarySession متدهایی مانند:

  • onGetLibraryRoot() برای زمانی که یک کلاینت، MediaItem ریشه درخت محتوا را درخواست می کند
  • onGetChildren() برای زمانی که مشتری از فرزندان یک MediaItem در درخت محتوا درخواست می کند
  • onGetSearchResult() برای زمانی که یک کلاینت نتایج جستجو را از درخت محتوا برای یک پرس و جو داده شده درخواست می کند.

روش‌های برگشت تماس مربوطه شامل یک شی LibraryParams با سیگنال‌های اضافی در مورد نوع درخت محتوایی است که برنامه مشتری به آن علاقه دارد.