Phân phát nội dung bằng MediaLibraryService

Ứng dụng đa phương tiện thường chứa những tập hợp mục nội dung đa phương tiện và được sắp xếp theo hệ thống phân cấp. Ví dụ: các bài hát trong một đĩa nhạc hoặc các tập phim truyền hình trong một danh sách phát. Hệ phân cấp các mục nội dung đa phương tiện này được gọi là thư viện nội dung nghe nhìn.

Ví dụ về nội dung đa phương tiện được sắp xếp theo hệ thống phân cấp
Hình 1: Ví dụ về hệ phân cấp mục nội dung đa phương tiện tạo thành một thư viện nội dung nghe nhìn.

MediaLibraryService cung cấp một API đã chuẩn hoá để phân phát và truy cập vào thư viện nội dung nghe nhìn của bạn. Điều này có thể hữu ích, chẳng hạn như khi thêm tính năng hỗ trợ Android Auto vào ứng dụng đa phương tiện của bạn, ứng dụng này cung cấp giao diện người dùng an toàn cho người lái xe riêng trong thư viện nội dung đa phương tiện của bạn.

Tạo một MediaLibraryService

Việc triển khai MediaLibraryService cũng tương tự như triển khai MediaSessionService, ngoại trừ trong phương thức onGetSession(), bạn nên trả về MediaLibrarySession thay vì 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();
  }
}

Hãy nhớ khai báo Service và cả các quyền cần thiết trong tệp kê khai:

<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" />

Sử dụng MediaLibrarySession

API MediaLibraryService yêu cầu thư viện nội dung đa phương tiện của bạn có cấu trúc ở định dạng cây, với một nút gốc duy nhất và các nút con có thể phát hoặc xem được hơn.

MediaLibrarySession mở rộng API MediaSession để thêm các API duyệt nội dung. So với lệnh gọi lại MediaSession, lệnh gọi lại MediaLibrarySession sẽ thêm các phương thức như:

  • onGetLibraryRoot() khi ứng dụng yêu cầu MediaItem gốc của cây nội dung
  • onGetChildren() khi ứng dụng yêu cầu phần tử con của MediaItem trong cây nội dung
  • onGetSearchResult() khi một ứng dụng yêu cầu kết quả tìm kiếm từ cây nội dung cho một cụm từ tìm kiếm nhất định

Các phương thức gọi lại phù hợp sẽ bao gồm đối tượng LibraryParams có các tín hiệu bổ sung về loại cây nội dung mà ứng dụng khách quan tâm.