本文將介紹您在使用媒體播放器前,應熟悉的基本概念。
音訊和視訊類別
下列類別會在 Android 架構中播放音訊和影片:
MediaPlayer
:這是播放音訊和影片的主要 API。AudioManager
:此類別會管理裝置上的音訊來源和音訊輸出。
資訊清單宣告
開始使用 MediaPlayer 開發應用程式前,請確認資訊清單已提供適當的宣告,以便使用相關功能。
網路權限:如果您使用 MediaPlayer 串流播放網路內容,應用程式必須要求網路存取權。
<uses-permission android:name="android.permission.INTERNET" />
Wake Lock 權限:如果您的播放器應用程式需要防止螢幕變暗或處理器進入休眠狀態,或是使用
MediaPlayer.setScreenOnWhilePlaying(boolean)
或MediaPlayer.setWakeMode(android.content.Context, int)
方法,則必須要求這項權限。<uses-permission android:name="android.permission.WAKE_LOCK" />
使用 MediaPlayer 類別
MediaPlayer
類別是媒體架構的重要元件。這個類別的物件可在最少的設定下,擷取、解碼及播放音訊和影片。MediaPlayer
支援多種媒體來源,包括:
- 本機資源
- 內部 URI,例如您可能從 Content Resolver 取得的 URI
- 外部網址 (串流)
如需 Android 支援的媒體格式清單,請參閱「支援的媒體格式」頁面。
使用音訊來源的範例
以下範例說明如何播放可用於當地原始資源 (儲存在應用程式的 res/raw/
目錄中) 的音訊:
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you
Java
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
在這種情況下,「原始」資源是指系統不會以任何特定方式嘗試剖析的檔案。不過,此資源的內容不應為原始音訊。必須是使用任一支援格式,並正確編碼及格式化的媒體檔案。
以下說明如何從系統中本機提供的 URI (例如透過 Content Resolver 取得) 播放內容:
Kotlin
val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(applicationContext, myUri)
prepare()
start()
}
Java
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
使用 HTTP 串流功能從遠端網址播放內容的情況如下:
Kotlin
val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(url)
prepare() // might take long! (for buffering, etc)
start()
}
Java
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
使用非同步準備功能來改善效能
使用 MediaPlayer
時,請留意效能。舉例來說,呼叫 prepare()
可能會花費很長的時間執行,因為這可能涉及擷取及解碼媒體資料。因此,如同任何可能需要很長時間才能執行完畢的方法,請勿從應用程式的 UI 執行緒呼叫此方法。這會導致 UI 停止回應,直到方法傳回為止,這會導致使用者體驗不佳,並可能導致 ANR (應用程式無回應) 錯誤。
為避免 UI 執行緒掛起,請產生另一個執行緒來準備 MediaPlayer
,並在完成時通知主執行緒。這個架構提供簡便的方法,可用來執行這項工作的 prepareAsync()
方法。此方法會開始在背景準備媒體,並立即傳回。媒體完成準備後,系統會呼叫透過 setOnPreparedListener()
設定的 MediaPlayer.OnPreparedListener
的 onPrepared()
方法。
瞭解詳情
如要在應用程式中播放媒體,建議您採用 Jetpack Media3 解決方案。請參閱更多資訊。
以下頁面將說明錄製、儲存及播放音訊和影片的相關主題: