MediaLibraryService を使用してコンテンツを提供する

多くの場合、メディアアプリには、階層的に編成されたメディア アイテムのコレクションが含まれます。アルバム内の曲や、プレイリスト内のテレビ番組のエピソードなど。このメディア アイテムの階層は、メディア ライブラリと呼ばれます。

階層構造のメディア コンテンツの例
図 1: メディア ライブラリを形成するメディア アイテムの階層の例。

MediaLibraryService は、メディア ライブラリの提供とアクセスを行うための標準化された API を提供します。これは、たとえば、メディアアプリに Android Auto のサポートを追加する場合に役立ちます。Android Auto は、メディア ライブラリ用に独自のドライバセーフ UI を提供します。

MediaLibraryService をビルドする

MediaLibraryService の実装は MediaSessionService の実装と似ていますが、onGetSession() メソッドでは MediaSession ではなく MediaLibrarySession を返す必要があります。

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 API は、メディア ライブラリが 1 つのルートノードと子ノード(再生可能またはブラウズ可能)を持つツリー形式で構造化されていることを前提としています。

MediaLibrarySessionMediaSession API を拡張して、コンテンツ ブラウジング API を追加します。MediaSession コールバックと比較すると、MediaLibrarySession コールバックでは次のようなメソッドが追加されます。

  • onGetLibraryRoot(): クライアントがコンテンツ ツリーのルート MediaItem をリクエストした場合
  • onGetChildren(): クライアントがコンテンツ ツリー内の MediaItem の子をリクエストした場合
  • onGetSearchResult(): クライアントが特定のクエリに対してコンテンツ ツリーの検索結果をリクエストした場合

関連するコールバック メソッドには、クライアント アプリが関心を持つコンテンツ ツリーのタイプに関する追加のシグナルを含む LibraryParams オブジェクトが含まれます。