แสดงเนื้อหาด้วย 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" />
เพื่อใช้งานร่วมกับไคลเอ็นต์ที่ใช้ Media API แบบเดิมได้

ใช้ MediaLibrarySession

MediaLibraryService API คาดหวังว่าคลังสื่อของคุณจะมีโครงสร้างในรูปแบบต้นไม้ โดยมีโหนดรูทโหนดเดียวและโหนดย่อยที่เล่นได้หรือเรียกดูเพิ่มเติมได้

MediaLibrarySession ขยาย MediaSession API เพื่อเพิ่ม API การเรียกดูเนื้อหา เมื่อเทียบกับ MediaSession callback แล้ว MediaLibrarySession callback จะมีวิธีการเพิ่มเติม เช่น

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

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