開始使用媒體播放器

本文將介紹您在使用媒體播放器前,應熟悉的基本概念。

音訊和視訊類別

下列類別會在 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.OnPreparedListeneronPrepared() 方法。

瞭解詳情

如要在應用程式中播放媒體,建議您採用 Jetpack Media3 解決方案。請參閱更多資訊

以下頁面將說明錄製、儲存及播放音訊和影片的相關主題: