本文件將說明兩個可能會發生錯誤的區域。
狀態。在「Medialayer」中,某些作業僅在特定狀態下有效。不正確的操作可能會導致例外狀況或非預期行為。
資源:進行設定變更 (例如螢幕旋轉) 時,您必須釋放
MediaPlayer
物件,以便釋出系統資源並避免資源耗盡。
管理狀態
MediaPlayer
是依狀態而定。也就是說,它具有內部狀態,您在編寫程式碼時必須隨時留意,因為某些作業只有在播放器處於特定狀態時才有效。如果在錯誤狀態下執行作業,系統可能會擲回例外狀況,或導致其他不良行為。
MediaPlayer
類別文件中的狀態圖表清楚說明哪些方法會將 MediaPlayer
從一個狀態移至另一個狀態。例如:
- 建立新的
MediaPlayer
時,該物件會處於閒置狀態。 - 您可以呼叫
setDataSource()
來初始化,這會將其變更為 Initialized 狀態。 - 您可以使用
prepare()
或prepareAsync()
方法準備資料。 MediaPlayer
準備就緒後,就會進入Prepared
狀態,這表示您可以呼叫start()
來播放媒體。
此時,您可以呼叫 start()
、pause()
和 seekTo()
等方法,在 Started
、Paused
和 PlaybackCompleted
狀態之間移動,如圖所示。
不過,請注意,呼叫 stop()
時,您必須再次準備 MediaPlayer
,才能再次呼叫 start()
。
編寫與 MediaPlayer
物件互動的程式碼時,請務必考量狀態圖表,因為從錯誤狀態呼叫其方法是常見的錯誤原因。
釋放 MediaPlayer
MediaPlayer
可能會耗用寶貴的系統資源。因此,您應一律採取額外預防措施,確保不會保留 MediaPlayer
例項超過必要時間。完成後,請務必呼叫 release()
,確保系統資源已正確釋出。
舉例來說,如果您使用 MediaPlayer
,且活動接收到對 onStop()
的呼叫,就必須釋放 MediaPlayer
,因為在活動未與使用者互動時,保留 MediaPlayer
並無意義 (除非您在背景播放媒體,這會在下一節討論)。
當活動繼續執行或重新啟動時,您當然需要建立新的 MediaPlayer
,並在繼續播放前再次準備。
以下是釋出及清除 MediaPlayer
的方法:
Kotlin
mediaPlayer?.release()
mediaPlayer = null
Java
mediaPlayer.release();
mediaPlayer = null;
舉例來說,如果您在活動停止時忘記釋放 MediaPlayer
,但在活動重新啟動時建立新的 MediaPlayer
,就會發生問題。當使用者變更螢幕方向 (或以其他方式變更裝置設定) 時,系統會預設重新啟動活動。當使用者在直向和橫向之間來回旋轉裝置時,您可能會快速耗用所有系統資源,因為每次變更螢幕方向時,您都會建立一個永遠不會釋出的 MediaPlayer
。
如要進一步瞭解如何重新啟動執行階段,請參閱「處理執行階段變更」。
您可能會想知道,如果想在使用者離開活動後繼續播放「背景媒體」,會發生什麼情況,這與內建的音樂應用程式行為非常相似。在這種情況下,您需要由服務控制的 MediaPlayer
,詳情請見下一節
瞭解詳情
如要在應用程式中播放媒體,建議您採用 Jetpack Media3 解決方案。請參閱更多資訊。
以下頁面將說明錄製、儲存及播放音訊和影片的相關主題: