このドキュメントでは、注意すべき 2 つの領域について説明します。
State. 「Medialayer」では、特定のオペレーションは特定の状態でのみ有効です。操作が正しくないと、例外や予期しない動作が発生する可能性があります。
リソース 画面の回転などの構成の変更を行う場合は、
MediaPlayerオブジェクトを解放してシステム リソースを解放し、リソースの枯渇を回避する必要があります。
状態を管理する
MediaPlayer は状態ベースです。つまり、操作によっては、プレーヤーが特定の状態のときにのみ有効になります。そのため、コードを記述する際には、常に内部状態を意識する必要があります。状態に適さない操作を行うと、システムから例外がスローされるなど、望ましくない動作が発生する可能性があります。
MediaPlayer クラスのドキュメントの状態遷移図には、MediaPlayer の状態がどのメソッドによりどう変わるかが示されています。次に例を示します。
- 新しい
MediaPlayerを作成すると、アイドル状態になります。 setDataSource()を呼び出して初期化すると、初期化済み状態に変わります。prepare()メソッドまたはprepareAsync()メソッドを使用して準備します。MediaPlayerの準備が完了すると、Prepared状態になります。つまり、start()を呼び出してメディアを再生できます。
図が示すように、この時点では、start()、pause()、seekTo() などのメソッドを呼び出すことで、Started、Paused、PlaybackCompleted の各状態間を行き来できます。
ただし、stop() を呼び出した場合は、MediaPlayer を再度準備するまで start() を呼び出すことはできません。
MediaPlayer オブジェクトを操作するコードを記述する際は、常に状態遷移図を念頭に置いてください。状態に合わないメソッドの呼び出しは、よく見られるバグです。
MediaPlayer を解放する
MediaPlayer は、貴重なシステム リソースを消費する可能性があります。そのため、MediaPlayer インスタンスが必要以上に長く存在することのないよう、常に特別な措置を講じなければなりません。使用を終了したら必ず release() を呼び出して、割り当てられたシステム リソースが適切に解放されるようにする必要があります。
たとえば、MediaPlayer を使用していて、アクティビティが onStop() の呼び出しを受け取った場合、MediaPlayer を解放する必要があります。アクティビティがユーザーとやり取りしていない間、それを保持しておく意味はほとんどないためです(次のセクションで説明するバックグラウンドでメディアを再生している場合を除く)。
当然のことながら、アクティビティを再開または再起動するときには、再生を再開する前に、MediaPlayer を新たに作成してもう一度準備を行う必要があります。
MediaPlayer の解放と無効化は次のように行います。
Kotlin
mediaPlayer?.release()
mediaPlayer = null
Java
mediaPlayer.release();
mediaPlayer = null;
例として、MediaPlayer をアクティビティ停止時に解放し忘れ、アクティビティ再開時に新しく作成した場合に起こりうる問題を考えてみましょう。ユーザーが画面の向きを変更した場合(またはデバイスの構成を別の方法で変更した場合)、システムはデフォルトでアクティビティを再起動します。ユーザーがデバイスを縦向きと横向きに回転させるたびに、新しい MediaPlayer が作成され、解放されないため、システム リソースがすぐに消費される可能性があります。
ランタイムの再起動の詳細については、構成の変更を処理するをご覧ください。
ユーザーがアクティビティを離れた場合でも、組み込みの音楽アプリで行うのと同様に、「バックグラウンド メディア」の再生を続けたい場合はどうすればよいか、という疑問が生じるかもしれません。その場合は、次のセクションで説明するように、サービスで制御する MediaPlayer が必要になります。
詳細
Jetpack Media3 は、アプリでのメディア再生に推奨されるソリューションです。詳しくは、こちらをご覧ください。
以下は音声と動画の録音、録画、保存、再生に関するトピックを扱うページです。