Android MediaPlayer類詳解
Android的多媒體框架支持各類常見的多媒體類型,這樣在程序中能夠很容易地集成音頻、視頻或者圖片。Android下對於音頻或者視頻的支持均須要使用到MediaPlayer類html
MediaPlayer處於Android多媒體包下"android.media.MediaPlayer",僅有一個無參的構造函數,雖然Android平臺僅爲咱們提供了一個無參的構造函數,可是爲了方便咱們初始化,還爲咱們提供了幾個靜態的create()方法用於完成MediaPlayer初始化的工做。(經常使用的兩個)android
- 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使用注意事項
- 在使用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();
}
});
- 使用完MediaPlayer須要回收資源。MediaPlayer是很消耗系統資源的,因此在使用完MediaPlayer,不要等待系統自動回收,最好是主動回收資源。
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
- 對於單曲循環之類的操做,除了能夠使用setLooping()方法進行設置以外,還能夠爲MediaPlayer註冊回調函數,MediaPlayer.setOnCompletionListener(),它會在MediaPlayer播放完畢被回調。
// 設置循環播放
// mediaPlayer.setLooping(true);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// 在播放完畢被回調
play();
}
});
- 由於MediaPlayer一直操做的是一個流媒體,因此無可避免的可能一段流媒體資源,前半段能夠正常播放,而中間一段由於解析或者源文件錯誤等問題,形成中間一段沒法播放問題,須要咱們處理這個錯誤,不然會影響Ux(用戶體驗)。能夠爲MediaPlayer註冊回調函數setOnErrorListener()來設置出錯以後的解決辦法,通常從新播放或者播放下一個流媒體便可。