本文將介紹使用 媒體播放器 前應先瞭解的基本概念。
音訊和視訊課程
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,例如您可能從內容解析器取得的 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 播放內容 (例如透過內容解析器取得的 URI):
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 在應用程式中播放媒體。瞭解詳情。
這些頁面涵蓋音訊和影片的錄製、儲存及播放相關主題: