Media3 ExoPlayer を使用して基本的なメディア プレーヤー アプリを作成する

Jetpack Media3 は、基本機能を概説する Player インターフェースを定義しています 動画や音声ファイルの再生に使用できます。ExoPlayer がデフォルトの実装です。 作成します。ExoPlayer を使用することをおすすめします。これにより、 ほとんどの再生ユースケースをカバーする包括的な機能セットを 提供しています。 追加的なユースケースに対応できるように カスタマイズが可能ですExoPlayer も デバイスと OS の断片化を抽象化し、コードが一貫して動作 Android エコシステム全体で 利用できますExoPlayer には以下が含まれます。

このページでは、再生を作成するための主な手順について説明します。 をご覧ください。また、詳細については、このモジュールの Media3 ExoPlayer

はじめに

まず、ExoPlayer、UI、Common モジュールに対する依存関係を追加します。 Jetpack Media3:

implementation "androidx.media3:media3-exoplayer:1.4.1"
implementation "androidx.media3:media3-ui:1.4.1"
implementation "androidx.media3:media3-common:1.4.1"

ユースケースによっては、Media3 DASH 形式でストリームを再生するための exoplayer-dash など。

1.4.1 は、ご使用のバージョンに置き換えてください。 ライブラリです。詳細については、リリースノートをご覧ください。 最新のバージョンを確認してください。

メディア プレーヤーの作成

Media3 では、付属の Player の実装を使用できます。 インターフェース(ExoPlayer)を使用することも、独自のカスタム実装を作成することもできます。

ExoPlayer の作成

ExoPlayer インスタンスを作成する最も簡単な方法は次のとおりです。

Kotlin

val player = ExoPlayer.Builder(context).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();

メディア プレーヤーは、onCreate() 存在する場所の ActivityFragment、または Service

Builder には以下が含まれます。 次のようなさまざまなカスタマイズ オプションが用意されています。

Media3 は、アプリのプロパティに含めることができる PlayerView UI コンポーネントを提供します。 作成します。このコンポーネントは再生用に PlayerControlView をカプセル化します コントロール、SubtitleView(字幕表示)、Surface(レンダリング) 動画をご覧ください。

プレーヤーを準備する

再生リストにメディア アイテムを追加する 次のようなメソッドを使用します。 setMediaItem() および addMediaItem()。 次に、prepare() を呼び出して メディアの読み込みを開始し、必要なリソースを取得します。

アプリがフォアグラウンドで実行されるまでは、この手順を実行しないでください。お使いの プレーヤーが Activity または Fragment にある場合、 API レベル 24 以降の onStart() ライフサイクル メソッドまたは onResume() 使用する必要があります。Service のプレーヤーの場合、 onCreate() で準備できます。

プレーヤーを操作する

プレーヤーを準備したら、メソッドを呼び出して再生を制御できます。 必要があります。

PlayerViewPlayerControlView などの UI コンポーネントが更新される それに応じてプレーヤーにバインドされます。

プレーヤーを解放する

再生には、動画など、供給が限られているリソースが必要になる場合がある そのため、release() を呼び出すことが重要です。 プレーヤーが不要になったときにリソースを解放できます。

プレーヤーが Activity または Fragment にある場合は、 API レベル 24 以降の onStop() ライフサイクル メソッドまたは onPause() メソッドを API レベル 23 以下に実装する必要があります。Service 内のプレーヤーの場合、次のことができます。 onDestroy() でリリースします。

メディア セッションでの再生を管理する

Android では、メディア セッションによって標準化された方法でメディアを操作できます。 プロセス境界を越えることもできます。メディア セッションをプレーヤーに接続する メディアの再生を外部にアドバタイズし、再生を受信できます。 コマンドなど、外部ソースからのコマンドを モバイルおよび大規模でのシステム メディア コントロール

メディア セッションを使用するには、Media3 Session モジュールに依存関係を追加します。

implementation "androidx.media3:media3-session:1.4.1"

メディア セッションを作成する

プレーヤーを初期化した後、次のように MediaSession を作成できます。

Kotlin

val player = ExoPlayer.Builder(context).build()
val mediaSession = MediaSession.Builder(context, player).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();
MediaSession mediaSession = new MediaSession.Builder(context, player).build();

Media3 は、Player の状態を MediaSession。これは、以下を含む任意の Player 実装で機能します。 ExoPlayerCastPlayer、または カスタム実装を行えます

他のクライアントに制御権限を付与する

クライアント アプリはメディア コントローラを実装できます をタップし、メディア セッションの再生を操作します。これらのリクエストを受信するには、 callback オブジェクトを追加する MediaSession を作成しています。

コントローラがメディア セッションに接続しようとすると、 onConnect() メソッドが呼び出されます。提供されている ControllerInfo を使用できます。 承諾するかどうかを決定する または拒否 表示されます。この例は、Media3 Session デモアプリをご覧ください。

接続されると、コントローラからセッションに再生コマンドを送信できます。「 セッションはそれらのコマンドをプレーヤーに委任します。再生とプレイリスト Player インターフェースで定義されたコマンドは、 あります。

他のコールバック メソッドを使用すると、 カスタム再生コマンド 再生リストの変更も行います。これらのコールバックにも同様に ControllerInfo オブジェクトが含まれているため、 リクエストごとにアクセス制御を決定できます。

メディアをバックグラウンドで再生しています

アプリがフォアグラウンドにないときでもメディアの再生を続行する ユーザーがアプリを持っていない場合でも、音楽、オーディオブック、ポッドキャストを再生できる PlayerMediaSessionフォアグラウンド サービス。Media3 は、 この目的の MediaSessionService インターフェース。

MediaSessionService の実装

MediaSessionService を拡張するクラスを作成し、 onCreate() ライフサイクル メソッドの MediaSession

Kotlin

class PlaybackService : MediaSessionService() {
    private var mediaSession: MediaSession? = null

    // Create your Player and MediaSession in the onCreate lifecycle event
    override fun onCreate() {
        super.onCreate()
        val player = ExoPlayer.Builder(this).build()
        mediaSession = MediaSession.Builder(this, player).build()
    }

    // Remember to release the player and media session in onDestroy
    override fun onDestroy() {
        mediaSession?.run {
            player.release()
            release()
            mediaSession = null
        }
        super.onDestroy()
    }
}

Java

public class PlaybackService extends MediaSessionService {
    private MediaSession mediaSession = null;

    @Override
    public void onCreate() {
        super.onCreate();
        ExoPlayer player = new ExoPlayer.Builder(this).build();
        mediaSession = new MediaSession.Builder(this, player).build();
    }

    @Override
    public void onDestroy() {
        mediaSession.getPlayer().release();
        mediaSession.release();
        mediaSession = null;
        super.onDestroy();
    }
}

マニフェストで、MediaSessionService インテントを指定した Service クラス フォアグラウンドを実行する FOREGROUND_SERVICE 権限をフィルタしてリクエストする 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" />

最後に、作成したクラスで、onGetSession() メソッドをオーバーライドして、 クライアントがメディア セッションにアクセスできるようにします。MediaSession を返して リクエストを拒否する場合は null を返します。

Kotlin

// This example always accepts the connection request
override fun onGetSession(
    controllerInfo: MediaSession.ControllerInfo
): MediaSession? = mediaSession

Java

@Override
public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) {
  // This example always accepts the connection request
  return mediaSession;
}

UI に接続する

これで、メディア セッションが Activity とは別の Service になりました。 プレーヤー UI が存在する Fragment 以外の場所では、MediaController を使用してリンクできます。 できます。Activity または FragmentonStart() メソッドで、 MediaSessionSessionToken を作成してから、SessionToken を使用する MediaController を作成します。MediaController のビルド 使用できます。

Kotlin

override fun onStart() {
  val sessionToken = SessionToken(this, ComponentName(this, PlaybackService::class.java))
  val controllerFuture = MediaController.Builder(this, sessionToken).buildAsync()
  controllerFuture.addListener(
    {
        // Call controllerFuture.get() to retrieve the MediaController.
        // MediaController implements the Player interface, so it can be
        // attached to the PlayerView UI component.
        playerView.setPlayer(controllerFuture.get())
      },
    MoreExecutors.directExecutor()
  )
}

Java

@Override
public void onStart() {
  SessionToken sessionToken =
    new SessionToken(this, new ComponentName(this, PlaybackService.class));
  ListenableFuture<MediaController> controllerFuture =
    new MediaController.Builder(this, sessionToken).buildAsync();
  controllerFuture.addListener(() -> {
    // Call controllerFuture.get() to retrieve the MediaController.
    // MediaController implements the Player interface, so it can be
    // attached to the PlayerView UI component.
    playerView.setPlayer(controllerFuture.get());
  }, MoreExecutors.directExecutor())
}

MediaControllerPlayer インターフェースを実装しているため、同じものを使用できます メソッド(play()pause() など)を使用して再生を制御します。その他に類似 サポートが終了した時点でMediaControllerリリースすること ActivityonStop() ライフサイクル メソッドなど、必要な関数を MediaController.releaseFuture()

通知の公開

フォアグラウンド サービスは、アクティブなときに通知を公開する必要があります。 MediaSessionService によって自動的に MediaStyle 件の通知 MediaNotification の形式で表されます。 カスタム通知を提供するには、 MediaNotification.Provider 参加者: DefaultMediaNotificationProvider.Builder プロバイダ インターフェースのカスタム実装を作成します。を プロバイダを MediaSession に接続し、 setMediaNotificationProvider

コンテンツ ライブラリを宣伝する

MediaLibraryService は、クライアントの許可により MediaSessionService をベースとする アプリで、アプリで提供されるメディア コンテンツをブラウジングできます。クライアント アプリは、 MediaBrowser で操作できます MediaLibraryService

MediaLibraryService の実装は、 MediaSessionService を返します。ただし、onGetSession() では MediaSession ではなく MediaLibrarySession。以前の MediaSession.CallbackMediaLibrarySession.Callback には、 メソッドによって提供されるコンテンツをブラウザ クライアントが移動できるようにする方法 使用します。

MediaSessionService と同様に、MediaLibraryService を フォアグラウンド サービスを実行するために FOREGROUND_SERVICE 権限をリクエストする service:

<service
    android:name=".PlaybackService"
    android:foregroundServiceType="mediaPlayback"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.media3.session.MediaLibraryService"/>
        <action android:name="android.media.browse.MediaBrowserService"/>
    </intent-filter>
</service>

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

上記の例には、MediaLibraryService の両方のインテント フィルタが含まれています。 下位互換性を確保するために、従来の MediaBrowserService を使用します。「 追加のインテント フィルタにより、MediaBrowserCompat API を使用してクライアント アプリが有効になります。 Service を認識します。

MediaLibrarySession を使用すると、コンテンツ ライブラリをツリー形式で提供できます。 単一ルート MediaItem を持つ構造です。ツリー内の各 MediaItem に設定できる 任意の数の子 MediaItem ノード。別のルート、または別のルートの 基づいて、異なるツリーを表示します。たとえば、このツリーには、 顧客が推奨メディア アイテムのリストを探している場合 ルート MediaItem と単一レベルの子 MediaItem ノードが含まれます。 別のクライアント アプリに戻るツリーは、 完全なコンテンツライブラリを ご利用いただけます

MediaLibrarySession の作成

MediaLibrarySession MediaSession API を拡張してコンテンツ ブラウジング API を追加します。従来の MediaSession コールバックMediaLibrarySession コールバック 次のようなメソッドを追加します。

  • onGetLibraryRoot() クライアントがコンテンツ ツリーのルート MediaItem をリクエストしたとき
  • onGetChildren() クライアントがコンテンツ ツリー内の MediaItem の子をリクエストしたとき
  • onGetSearchResult() クライアントが特定の 検索語句

関連するコールバック メソッドには、LibraryParams が含まれます。 クライアント アプリが作成するコンテンツ ツリーのタイプに関する追加のシグナルを含む、 わかります。