開始使用媒體播放器

本文將介紹使用 媒體播放器 前應先瞭解的基本概念。

音訊和視訊課程

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.OnPreparedListeneronPrepared() 方法。

瞭解詳情

建議您使用 Jetpack Media3 在應用程式中播放媒體。瞭解詳情

這些頁面涵蓋音訊和影片的錄製、儲存及播放相關主題: