แสดงเนื้อหาด้วย MediaLibraryService

แอปสื่อมักประกอบด้วยคอลเล็กชันรายการสื่อที่จัดเป็นลำดับชั้น เช่น เพลงในอัลบั้มหรือตอนของรายการทีวีในเพลย์ลิสต์ ลำดับชั้นของ รายการสื่อเรียกว่าคลังสื่อ

วันที่ ตัวอย่างเนื้อหาสื่อที่จัดเรียงตามลําดับชั้น
รูปที่ 1: ตัวอย่างลำดับชั้นของรายการสื่อที่ก่อให้เกิด คลังสื่อ

MediaLibraryService มี API มาตรฐานเพื่อให้บริการและเข้าถึง ไลบรารีสื่อ ซึ่งจะเป็นประโยชน์ ตัวอย่างเช่น เมื่อเพิ่มการสนับสนุนสำหรับ Android Auto ไปยังแอปสื่อของคุณ ซึ่งเป็นแอป UI ที่ปลอดภัยต่อผู้ขับขี่สำหรับคลังสื่อของคุณ

สร้าง 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 และสิทธิ์ที่จำเป็นในไฟล์ Manifest รวมทั้ง

<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 ขยาย MediaSession API เพื่อเพิ่ม API การเรียกดูเนื้อหา เทียบกับ MediaSession Callback, การติดต่อกลับของ MediaLibrarySession เพิ่มเมธอด เช่น

  • onGetLibraryRoot() สำหรับเวลาที่ไคลเอ็นต์ขอรูท MediaItem ของโครงสร้างเนื้อหา
  • onGetChildren() สำหรับเมื่อลูกค้าขอองค์ประกอบย่อยของ MediaItem ในโครงสร้างเนื้อหา
  • onGetSearchResult() สำหรับเวลาที่ลูกค้าขอผลการค้นหาจากโครงสร้างเนื้อหาของ คำถาม

วิธีการโทรกลับที่เกี่ยวข้องจะมี LibraryParams ที่มีสัญญาณเพิ่มเติมเกี่ยวกับประเภทโครงสร้างเนื้อหาที่แอปไคลเอ็นต์ สนใจ