Jetpack Media3 は、基本機能を概説する Player
インターフェースを定義しています
動画や音声ファイルの再生に使用できます。ExoPlayer
がデフォルトの実装です。
作成します。ExoPlayer を使用することをおすすめします。これにより、
ほとんどの再生ユースケースをカバーする包括的な機能セットを
提供しています。
追加的なユースケースに対応できるように
カスタマイズが可能ですExoPlayer も
デバイスと OS の断片化を抽象化し、コードが一貫して動作
Android エコシステム全体で
利用できますExoPlayer には以下が含まれます。
- プレイリストのサポート
- さまざまなプログレッシブ ストリーミングとアダプティブ ストリーミングのサポート 形式
- クライアントサイドとサーバーサイドの両方の広告挿入をサポート
- DRM で保護された再生のサポート
このページでは、再生を作成するための主な手順について説明します。 をご覧ください。また、詳細については、このモジュールの Media3 ExoPlayer。
はじめに
まず、ExoPlayer、UI、Common モジュールに対する依存関係を追加します。 Jetpack Media3:
implementation "androidx.media3:media3-exoplayer:1.4.0" implementation "androidx.media3:media3-ui:1.4.0" implementation "androidx.media3:media3-common:1.4.0"
ユースケースによっては、Media3
DASH 形式でストリームを再生するための exoplayer-dash
など。
1.4.0
は、ご使用のバージョンに置き換えてください。
ライブラリです。詳細については、リリースノートをご覧ください。
最新のバージョンを確認してください。
メディア プレーヤーの作成
Media3 では、付属の Player
の実装を使用できます。
インターフェース(ExoPlayer
)を使用することも、独自のカスタム実装を作成することもできます。
ExoPlayer の作成
ExoPlayer
インスタンスを作成する最も簡単な方法は次のとおりです。
Kotlin
val player = ExoPlayer.Builder(context).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context).build();
メディア プレーヤーは、onCreate()
存在する場所の Activity
、Fragment
、または Service
。
Builder
には以下が含まれます。
次のようなさまざまなカスタマイズ オプションが用意されています。
setAudioAttributes()
音声フォーカス処理を構成するsetHandleAudioBecomingNoisy()
オーディオ出力デバイスの接続が解除されたときの再生動作を設定できますsetTrackSelector()
トラック選択を設定する
Media3 は、アプリのプロパティに含めることができる PlayerView
UI コンポーネントを提供します。
作成します。このコンポーネントは再生用に PlayerControlView
をカプセル化します
コントロール、SubtitleView
(字幕表示)、Surface
(レンダリング)
動画をご覧ください。
プレーヤーを準備する
再生リストにメディア アイテムを追加する
次のようなメソッドを使用します。
setMediaItem()
および addMediaItem()
。
次に、prepare()
を呼び出して
メディアの読み込みを開始し、必要なリソースを取得します。
アプリがフォアグラウンドで実行されるまでは、この手順を実行しないでください。お使いの
プレーヤーが Activity
または Fragment
にある場合、
API レベル 24 以降の onStart()
ライフサイクル メソッドまたは onResume()
使用する必要があります。Service
のプレーヤーの場合、
onCreate()
で準備できます。
プレーヤーを操作する
プレーヤーを準備したら、メソッドを呼び出して再生を制御できます。 必要があります。
play()
、pause()
再生を開始、一時停止します- 移動位置:
seekTo()
現在のメディア アイテム内の位置 seekToNextMediaItem()
およびseekToPreviousMediaItem()
再生リスト内を移動します
PlayerView
や PlayerControlView
などの UI コンポーネントが更新される
それに応じてプレーヤーにバインドされます。
プレーヤーを解放する
再生には、動画など、供給が限られているリソースが必要になる場合がある
そのため、release()
を呼び出すことが重要です。
プレーヤーが不要になったときにリソースを解放できます。
プレーヤーが Activity
または Fragment
にある場合は、
API レベル 24 以降の onStop()
ライフサイクル メソッドまたは onPause()
メソッドを API レベル 23 以下に実装する必要があります。Service
内のプレーヤーの場合、次のことができます。
onDestroy()
でリリースします。
メディア セッションでの再生を管理する
Android では、メディア セッションによって標準化された方法でメディアを操作できます。 プロセス境界を越えることもできます。メディア セッションをプレーヤーに接続する メディアの再生を外部にアドバタイズし、再生を受信できます。 コマンドなどの外部ソースからのコマンドを モバイルおよび大規模でのシステム メディア コントロール 。
メディア セッションを使用するには、Media3 Session モジュールに依存関係を追加します。
implementation "androidx.media3:media3-session:1.4.0"
メディア セッションを作成する
プレーヤーを初期化した後、次のように 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
実装で機能します。
ExoPlayer
、CastPlayer
、または
カスタム実装を行えます
他のクライアントに制御権限を付与する
クライアント アプリはメディア コントローラを実装できます
をタップし、メディア セッションの再生を操作します。これらのリクエストを受信するには、
callback オブジェクトを追加する
MediaSession
を作成しています。
コントローラがメディア セッションに接続しようとすると、
onConnect()
メソッドが呼び出されます。提供されている ControllerInfo
を使用できます。
承諾するかどうかを決定する
または拒否
表示されます。この例は、Media3 Session デモアプリをご覧ください。
接続されると、コントローラからセッションに再生コマンドを送信できます。「
セッションはそれらのコマンドをプレーヤーに委任します。再生とプレイリスト
Player
インターフェースで定義されたコマンドは、
あります。
他のコールバック メソッドを使用すると、
カスタム再生コマンド
再生リストの変更などを行います。これらのコールバックにも同様に ControllerInfo
オブジェクトが含まれているため、
リクエストごとにアクセス制御を決定できます。
メディアをバックグラウンドで再生しています
アプリがフォアグラウンドにないときでもメディアの再生を続行する
ユーザーがアプリを持っていない場合でも、音楽、オーディオブック、ポッドキャストを再生できる
Player
と MediaSession
を
フォアグラウンド サービス。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
または Fragment
の onStart()
メソッドで、
MediaSession
の SessionToken
を作成してから、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()) }
MediaController
は Player
インターフェースを実装しているため、同じものを使用できます
メソッド(play()
や pause()
など)を使用して再生を制御します。その他に類似
サポートが終了した時点でMediaController
リリースすること
Activity
の onStop()
ライフサイクル メソッドなど、必要な関数を
MediaController.releaseFuture()
。
通知の公開
フォアグラウンド サービスは、アクティブなときに通知を公開する必要があります。
MediaSessionService
によって自動的に
MediaStyle
件の通知
MediaNotification
の形式で表されます。
カスタム通知を提供するには、
MediaNotification.Provider
参加者: DefaultMediaNotificationProvider.Builder
プロバイダ インターフェースのカスタム実装を作成します。を
プロバイダを MediaSession
に接続し、
setMediaNotificationProvider
。
コンテンツ ライブラリを宣伝する
MediaLibraryService
は、クライアントの許可により MediaSessionService
をベースとする
アプリで、アプリで提供されるメディア コンテンツをブラウジングできます。クライアント アプリは、
MediaBrowser
で操作できます
MediaLibraryService
。
MediaLibraryService
の実装は、
MediaSessionService
を返します。ただし、onGetSession()
では
MediaSession
ではなく MediaLibrarySession
。以前の
MediaSession.Callback
。MediaLibrarySession.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
が含まれます。
クライアント アプリが作成するコンテンツ ツリーのタイプに関する追加のシグナルを含む、
選択することもできます