MediaPlayer

Android MediaPlayer類詳解

 

Android的多媒體框架支持各種常見的多媒體類型,這樣在程序中可以很容易地集成音頻、視頻或者圖片。Android下對於音頻或者視頻的支持均需要使用到MediaPlayer

MediaPlayer處於Android多媒體包下"android.media.MediaPlayer",僅有一個無參的構造函數,雖然Android平臺僅爲我們提供了一個無參的構造函數,但是爲了方便我們初始化,還爲我們提供了幾個靜態的create()方法用於完成MediaPlayer初始化的工作。(常用的兩個)

  • static MediaPlayer create(Context context,int resid):通過給定的Id來創建一個MediaPlayer實例。
  • static MediaPlayer create(Context context,Uri uri):通過給定的Uri來創建一個MediaPlayer實例。
    還有一些重載的create方法,請自行查看API

MediaPlayer具體方法介紹:

  • void setDataSource(String path) 通過一個具體的路徑來設置MediaPlayer的數據源,path可以是本地的一個路徑,也可以是一個網絡路徑
  • void setDataSource(Context context, Uri uri) 通過給定的Uri來設置MediaPlayer的數據源,這裏的Uri可以是網絡路徑或是一個ContentProvider的Uri。
  • void setDataSource(MediaDataSource dataSource) 通過提供的MediaDataSource來設置數據源
  • void setDataSource(FileDescriptor fd) 通過文件描述符FileDescriptor來設置數據源
  • int getCurrentPosition() 獲取當前播放的位置
  • int getAudioSessionId() 返回音頻的session ID
  • int getDuration() 得到文件的時間
  • TrackInfo[] getTrackInfo() 返回一個track信息的數組
  • boolean isLooping () 是否循環播放
  • boolean isPlaying() 是否正在播放
  • void pause () 暫停
  • void start () 開始
  • void stop () 停止
  • void prepare() 同步的方式裝載流媒體文件。
  • void prepareAsync() 異步的方式裝載流媒體文件。
  • void reset() 重置MediaPlayer至未初始化狀態。
  • void release () 回收流媒體資源。
  • void seekTo(int msec) 指定播放的位置(以毫秒爲單位的時間)
  • void setAudioStreamType(int streamtype) 指定流媒體類型
  • void setLooping(boolean looping) 設置是否單曲循環
  • void setNextMediaPlayer(MediaPlayer next) 當 當前這個MediaPlayer播放完畢後,MediaPlayer next開始播放
  • void setWakeMode(Context context, int mode):設置CPU喚醒的狀態。
  • **setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 網絡流媒體的緩衝變化時回調 **
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 網絡流媒體播放結束時回調
  • **setOnErrorListener(MediaPlayer.OnErrorListener listener) 發生錯誤時回調 **
  • setOnPreparedListener(MediaPlayer.OnPreparedListener listener):當裝載流媒體完畢的時候回調。

在使用MediaPlayer播放一段流媒體的時候,需要使用prepare()或prepareAsync()方法把流媒體裝載進MediaPlayer,纔可以調用start()方法播放流媒體。
 setAudioStreamType()方法用於指定播放流媒體的類型,它傳遞的是一個int類型的數據,均以常量定義在AudioManager類中, 一般我們播放音頻文件,設置爲AudioManager.STREAM_MUSIC即可。

MediaPlayer使用注意事項

  1. 在使用start()播放流媒體之前,需要裝載流媒體資源。這裏最好使用prepareAsync()用異步的方式裝載流媒體資源。因爲流媒體資源的裝載是會消耗系統資源的,在一些硬件不理想的設備上,如果使用prepare()同步的方式裝載資源,可能會造成UI界面的卡頓,這是非常影響用於體驗的。因爲推薦使用異步裝載的方式,爲了避免還沒有裝載完成就調用start()而報錯的問題,需要綁定MediaPlayer.setOnPreparedListener()事件,它將在異步裝載完成之後回調。異步裝載還有一個好處就是避免裝載超時引發ANR((Application Not Responding)錯誤。
                mediaPlayer = new MediaPlayer();
                mediaPlayer.setDataSource(path);
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                
                // 通過異步的方式裝載媒體資源
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new OnPreparedListener() {                    
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        // 裝載完畢回調
                        mediaPlayer.start();
                    }
                });
  1. 使用完MediaPlayer需要回收資源。MediaPlayer是很消耗系統資源的,所以在使用完MediaPlayer,不要等待系統自動回收,最好是主動回收資源。
  if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
  1. 對於單曲循環之類的操作,除了可以使用setLooping()方法進行設置之外,還可以爲MediaPlayer註冊回調函數,MediaPlayer.setOnCompletionListener(),它會在MediaPlayer播放完畢被回調。
// 設置循環播放
//                mediaPlayer.setLooping(true);
                mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // 在播放完畢被回調
                        play();                        
                    }
                });
  1. 因爲MediaPlayer一直操作的是一個流媒體,所以無可避免的可能一段流媒體資源,前半段可以正常播放,而中間一段因爲解析或者源文件錯誤等問題,造成中間一段無法播放問題,需要我們處理這個錯誤,否則會影響Ux(用戶體驗)。可以爲MediaPlayer註冊回調函數setOnErrorListener()來設置出錯之後的解決辦法,一般重新播放或者播放下一個流媒體即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章