本文將說明兩個可能出現問題的領域。
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,但從未釋出。
如要進一步瞭解執行階段重新啟動,請參閱「處理執行階段變更」。
您可能會想知道,如果使用者離開活動,但您仍想繼續播放「背景媒體」,該怎麼做?這與內建的「音樂」應用程式行為非常相似。在這種情況下,您需要的是由 Service 控制的 MediaPlayer,詳情請見下一節。
瞭解詳情
建議您使用 Jetpack Media3 在應用程式中播放媒體。瞭解詳情。
這些頁面涵蓋音訊和影片的錄製、儲存及播放相關主題: