1. 程式人生 > >【Android 多媒體開發】 MediaPlayer 狀態機 介面 方法 解析

【Android 多媒體開發】 MediaPlayer 狀態機 介面 方法 解析

作者 : 韓曙亮

一. MediaPlayer 狀態機 介紹

Android MediaPlayer 狀態即圖例


1. Idle (閒置) 狀態 和 End (結束) 狀態


MediaPlayer 物件宣告週期 : 從 Idle 到 End 狀態就是 MediaPlayer 整個生命週期;

-- 生命週期開始 : 進入 Idle (閒置) 狀態;

-- 生命週期結束 : 進入 End (結束) 狀態;

Idle 和 End 狀態轉換

-- 進入 Idle 狀態 : MediaPlayer 剛被建立 new MediaPlayer() 或者 呼叫了 reset() 方法之後, 進入 Idle (閒置) 狀態;

-- 進入 End 狀態 : 在 Idle 狀態呼叫 release() 方法後, 會進入 End (結束) 狀態;

兩種進入 Idle 狀態方法的差別 : 在 Idle 狀態無法呼叫 getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamtype(int), setLooping(boolean), setVolume(float, float), pause(), start(), stop(), seekTo(), prepare(), prepareAsync() 方法都是錯誤的;

-- new MediaPlayer() 進入 Idle 狀態 : 此時 MediaPlayer 內部引擎 和 狀態都沒有改變, 呼叫上面的方法之後, 將 無法呼叫 OnErrorListener.onError() 方法;

-- reset() 進入 Idle 狀態 :  此時如果呼叫上面的方法, 內部的引擎就會 回撥 OnErrorListener.onError() 方法;

建立 和 過載 MediaPlayer 區別 :

-- 建立 MediaPlayer : 通過 new MediaPlayer() 建立的物件處於 Idle (閒置) 狀態;

-- 過載 MediaPlayer : 通過 create()

方法建立的 MediaPlayer 物件處於 Prepare (準備) 狀態;

End (結束) 狀態解析

-- release() 方法作用 : 該方法會釋放 播放引擎 中與 MediaPlayer 相關的資源;

-- 釋放唯一性資源 : 有些資源如 硬體加速元件 單態元件等都是唯一性的資源, 如果不釋放掉, 之後的 Mediaplayer 都無法正常執行;

-- 無法進行狀態轉換 : End 狀態代表 MediaPlayer 生命週期結束, 在此狀態不能轉換成其它狀態了;

2. Error (錯誤) 狀態


Error 狀態轉換 : 當 MediaPlayer 出現一些錯誤如 格式錯誤, 解析度過高等原因, 播放器引擎 就會呼叫 OnErrorListener.onError()方法;

-- 進入 Error 狀態 : 客戶端呼叫 OnErrorListener.onError() 方法, 會進入 Error 狀態;

-- 離開 Error 狀態 : 如果想要使用進入 Error 狀態的 MediaPlayer, 可以使用 reset() 方法進入 Idle 狀態;

註冊監聽 : 程式設計註冊一個 OnErrorListener 監聽器, 用於獲取 播放器引擎 內部發生的錯誤;

-- 註冊方法 : 呼叫 MediaPlayer.setOnErrorListener(OnErrorListener) 方法, 註冊 OnErrorListener;

關於一些異常丟擲 : 在不合法的地方呼叫方法, 會丟擲 IllegalStateException 異常;

3. Initalized (初始化) 狀態


Initialized 狀態轉換 : 在 Idle 狀態呼叫 setDataSource() 方法, MediaPlayer 會遷移到 Initialized 狀態;

-- 注意 : 只能是在 Idle 狀態呼叫該方法, 如果在其它狀態呼叫該方法, 會報出 IllegalStateException 異常;

4. Prepared (就緒) 和 Preparing (準備中) 狀態


Prepared (就緒) 狀態轉換

-- 從 Initialized 狀態遷移 : 在 Initialized 狀態呼叫 prepare() 方法, 如果方法成功返回, MediaPlayer 就會進入 Prepared 狀態;

-- 從 Preparing 狀態遷移 : 在 Preparing 狀態呼叫 OnPrepareListener.onPrepared() 方法遷移到 Prepared 狀態;

Preparing (準備中) 狀態 : Initialized 狀態呼叫 prepareAsync() 方法進入 Preparing 狀態;

-- 該狀態執行的操作 : 在 Preparing 狀態時, 播放器引擎會繼續完成準備工作, 同步版本返回 或者 非同步版本準備工作完成就會呼叫  OnPrepareListener.onPrepared() 方法進入 Prepared 狀態;

丟擲異常 : 只有在 Initialized 方法中才能呼叫 prepare() 和 prepareAsync()方法, 在其它狀態呼叫會報出 IllegalStateException 遺產;

Prepared 狀態 MediaPlayer 可進行的操作 : 在這個狀態 MediaPlayer 可以進行 音訊視訊屬性 迴圈屬性等操作;

5. Started (開始) 狀態


Started 狀態遷移 : 在 Prepared 狀態呼叫 start() 方法, MediaPlayer 即遷移到了 Started 狀態;

-- 判斷 MediaPlayer 是否在 Started 狀態 : 在任何狀態下呼叫 isPlaying() 方法, 可以判斷 MediaPlayer 是否在 Started 狀態;

-- 跟蹤緩衝狀態 : 在 Started 狀態, 呼叫 OnBufferingUpdateListener.onBufferingUpdate() 方法, 可以獲取視訊音訊流的緩衝狀態;

6. Paused (暫停) 狀態


Paused (暫停) 狀態遷移 : 在 Started 狀態呼叫 pause() 方法, MediaPlayer 會進入 Paused 狀態;

-- 狀態遷移時間 : Started 狀態轉換為 Paused 狀態需要一定時間, 這個過程是非同步的, 過一段時間之後 isPlaying() 狀態才會改變; 

-- 回到 Started 狀態 : 在 Paused 狀態呼叫 start() 方法, 會進入 Started 狀態;

7. Stopped (停止) 狀態


Stopped 狀態遷移 : 在 Prepared, Started, Paused, PlaybackCompleted 狀態下 呼叫 stop() 方法, MediaPlayer 會遷移到 Stopped 狀態;

8. 播放位置調整

          

seekTo() 方法說明 : 該方法非同步, 呼叫後 播放器引擎還需要進行其它操作, 跳轉才能完成;

-- 進行的操作 : 播放器引擎會回撥 OnSeekComplete.onSeekComplete()方法, 該方法通過 setOnSeekCompleteListener() 方法註冊;

-- seekTo() 方法呼叫狀態 : 該方法可以在 Prepared, Paused, PlaybackCompleted 狀態進行呼叫;

-- 獲取播放位置 : 呼叫 getCurrentPosition() 方法, 可以獲取當前播放的位置, 可以幫助播放器更新進度條;

9. PlaybackCompleted (播放完畢) 狀態


迴圈模式開啟 : 如果之前使用了 setLooping() 開啟了迴圈模式, 播放完畢之後 MediaPlayer 會重新進入 Started 狀態;

PlaybackCompleted 狀態遷移 : 如果沒有設定迴圈模式, 那麼播放完畢之後會呼叫 OnCompletion.onCompletion() 回撥方法, MediaPlayer 會進入 PlaybackCompleted 狀態;

-- OnCompletion註冊 : 呼叫 MediaPlayer.setOnCompletionListener() 註冊該監聽器;

-- 進入 Started 狀態方法 : 在 PlaybackCompleted 狀態時, 呼叫 satrt() 方法可以進入 Started 狀態;

二. MediaPlayer 介面 和 常量

1. MediaPlayer 介面

(1) 緩衝相關介面

介面介紹

-- 介面名稱 : MediaPlayer.OnBufferingUpdateListener;

-- 介面作用 : 定義一個回撥介面, 該介面的作用是在流媒體緩衝狀態發生改變的時候, 標明該狀態;

介面方法介紹

-- 介面方法

public abstract void onBufferingUpdate (MediaPlayer mp, int percent)

-- 方法作用 : 該方法在 MediaPlayer 通過 HTTP 下載緩衝視訊流的時候回撥, 用以改變視訊緩衝狀態;

-- 方法引數 : mpMediaPlayer 實體物件; percent 已經緩衝了的 或者 播放了的 媒體流百分比;

(2) 播放完畢相關介面

介面介紹

-- 介面名稱 : MediaPlayer.OnCompletionListener;

-- 介面作用 : 在介面中定義了 流媒體 播放完畢後回撥的方法;

介面方法介紹

-- 介面方法

public abstract void onCompletion (MediaPlayer mp)
-- 方法作用 : 在 媒體流 播放完畢之後回撥;

(3) 錯誤相關介面

介面介紹

-- 介面名稱 : MediaPlayer.OnErrorListener;

-- 介面作用 : 在該介面中定義回撥方法, 在非同步操作中出現錯誤時會回撥該方法, 其它情況下出現錯誤時直接丟擲異常;

介面方法介紹

-- 介面方法

public abstract boolean onError (MediaPlayer mp, int what, int extra)
-- 方法作用 : 非同步操作中出現錯誤時回撥該方法;

-- 引數介紹

--- a. MediaPlayer mp : MediaPlayer 實體類;

--- b. int what : 出現的錯誤型別, 如

MEDIA_ERROR_UNKONWN(位置錯誤) 或者

MEDIA_ERROR_SERVER_DIED(伺服器錯誤) ;

--- c. int extra : 針對與具體錯誤的附加碼, 用於定位錯誤更詳細資訊, 例如 

MEDIA_ERROR_IO(本地檔案或網路相關錯誤), 

MEDIA_ERROR_MALFORMAD (位元流不符合相關的編碼標準和檔案規範), 

MEDIA_ERROR_UNSUPPORTED(框架不支援該功能), 

MEDIA_ERROR_TIME_OUT(一些操作超時);

-- 方法執行結果 : 成功處理錯誤返回 true, 處理失敗返回 false, 如果沒有設定針對該方法的監聽器, 直接呼叫 OnCompletionListener 監聽器;

(4) 資訊相關介面

介面介紹

-- 介面名稱 : MediaPlayer.OnInfoListener;

-- 介面作用 : 該介面定義了一個回撥方法, 該方法在媒體播放時出現資訊或者警告時回撥該方法;

介面方法介紹

-- 介面方法

public abstract boolean onInfo (MediaPlayer mp, int what, int extra)

-- 方法作用 : 出現了資訊或者警告的時候回撥;

-- 引數介紹

--- a. MediaPlayer mp : MediaPlayer 實體物件;

--- b. int what : 資訊或者警告的型別, 如

MEDIA_INFO_UNKNOWN(未知的資訊), 

MEDIA_INFO_VEDIO_TRACK_LAGGING(視訊過於複雜解碼太慢), 

MEDIA_INFO_VEDIO_RENDERING_START(開始渲染第一幀), 

MEDIA_INFO_BUFFRING_START(暫停播放開始緩衝更多資料), 

MEDIA_INFO_BUFFERING_END(緩衝了足夠的資料重新開始播放), 

MEDIA_INFO_BAD_INTERLEAVING(錯誤交叉), 

MEDIA_INFO_NOT_SEEKABLE(媒體不能夠搜尋), 

MEDIA_INFO_METADATA_UPDATE(一組新的元資料用), 

MEDIA_INFO_UNSUPPORTED_SUBTITLE(不支援字幕), 

MEDIA_INFO_SUBTITLE_TIMED_OUT(讀取字幕使用時間過長);

--- c. int extra : 資訊或者警告的型別,

-- 返回值 : 如果處理了資訊就會返回 true, 沒有處理返回false, 如果沒有註冊該監聽, 就會忽略該資訊;

(5) 準備播放相關介面

介面介紹

-- 介面名稱 : MediaPlayer.OnPreparedListener;

-- 介面作用 : 該介面中定義一個回撥方法, 該方法在進入 Prepared 狀態 並 開始播放的時候回撥;

介面方法介紹

-- 介面方法

public abstract void onPrepared (MediaPlayer mp)

-- 方法作用 : 該方法在進入 Prepared 狀態 並 開始播放的時候回撥;

-- 引數介紹 : MediaPlayer mp , MediaPlayer 實體物件;

(6) 查詢操作相關介面

介面介紹

-- 介面名稱 : MediaPlayer.OnSeekCompleteListener;

-- 介面作用 : 該介面定義了一個回撥方法, 該方法在查詢操作完成後回撥;

介面方法介紹

-- 介面方法

public abstract void onSeekComplete (MediaPlayer mp)

-- 方法作用 : 查詢操作完成的時候回撥該方法;

(7) 視訊大小相關介面

介面介紹

-- 介面名稱 : MediaPlayer.OnVideSizeChangedListener;

-- 介面作用 : 該介面中定義了一個回撥方法, 當視訊大小首次被知曉或者更新的時候回撥該方法;

介面方法介紹

-- 介面方法

public abstract void onVideoSizeChanged (MediaPlayer mp, int width, int height)

-- 方法作用 : 視訊大小更新時回撥該方法, 如果沒有視訊返回0;

-- 引數解析 : int width 視訊的寬度, int height 視訊的高度;

三. MediaPlayer 常用方法解析

1. MediaPlayer 構造方法

方法的注意點 : 使用 create() 方法建立的 MediaPlayer, 直接指定了 媒體資源, 不需要再進行 呼叫 prepare() 方法;

(1) 預設構造方法

方法名稱 public MediaPlayer ();

public MediaPlayer ()

方法簡介 : 預設構造方法, 建立的 MediaPlayer 自動進入 Idle 狀態, 不同於 create() 方法, 建立的 MediaPlayer 自動進入 Prepared 狀態;

-- 兩種方法比較 : 因為 create() 方法建立的時候就指定了資料來源, 不用在 Idle 狀態設定資料, 並呼叫 prepare() 方法了;

(2) 指定uri的構造方法

方法名稱public static MediaPlayer create (Context context, Uri uri);

public static MediaPlayer create (Context context, Uri uri)

方法簡介 : 根據給定的 Uri 建立一個 MediaPlayer 物件, 如果建立成功, 其內部會自動呼叫 prepare() 方法, 不同再自己呼叫一次, MediaPlayer 使用完畢之後要使用 release()方法, 否則會出錯;

返回值 : 如果建立成功返回 MediaPlayer 物件, 如果建立失敗返回 null;

引數介紹

-- Context context : Android 的上下文物件;

-- Uri uri : 資料來源的 Uri; 

(3) 指定資源 id

方法名稱public static MediaPlayer create (Context context, int resid);

public static MediaPlayer create (Context context, int resid)

方法簡介 : 通過給定的 raw 資源 id, 建立 MediaPlayer 物件;

引數介紹 : int resid 設定播放原始檔, 這裡指的是 raw 資源 id;

(4) 指定 id 和 SurfaceView

方法名稱public static MediaPlayer create (Context context, Uri uri, SurfaceHolder holder);

public static MediaPlayer create (Context context, Uri uri, SurfaceHolder holder)

方法簡介 : 建立一個 MediaPlayer, 指定 MediaPlayer 資料來源 Uri 和 SurfaceView 物件;

引數介紹

-- Context context : Android 的上下文物件;

-- Uri uri : 指定的網路媒體的資料來源;

-- SurfaceHolder holder : 指定要播放視訊的 SurfaceHolder ;

2. 獲取播放器相關屬性方法

(1) 獲取當前位置

方法名稱public int getCurrentPosition ();

方法解析 : 獲取當前播放器播放的位置, 返回值是 已經播放了的毫秒數;

方法的有效狀態和無效狀態

-- 有效狀態 : Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Error 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(2) 獲取檔案時長

方法名稱public int getDuration ();

方法解析 : 獲取檔案的播放時長 (毫秒), 如果沒有可用的時長, 就會返回 -1;

方法的有效狀態和無效狀態 : 設定資料來源之後的非錯誤狀態 才可以獲取播放檔案時長;

-- 有效狀態 : PreparedStartedPausedStoppedPlaybackCompleted, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Idle, InitializedError 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(3) 獲取視訊高度 寬度

方法名稱 public int getVideoHeight (), public int getVideoWidth ();

方法解析 : 返回視訊的高度 或者 寬度, 如果沒有資源, 那麼會返回0, 當視訊大小改變的時候可以使用 MediaPlayer.OnVideoSizeChangedListener 監聽其監聽該事件;

方法的有效狀態和無效狀態 : 除 Error 以外的所有狀態;

-- 有效狀態 : IdleInitialized, PreparedStartedPausedStoppedPlaybackCompleted, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Error 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(4) 檢查 MediaPlayer 是否在迴圈

方法名稱public boolean isLooping ();

方法解析 : 檢查 MediaPlayer 是否在迴圈播放, 如果是 返回 true, 不是的話 返回 false;

方法的有效狀態和無效狀態 : 在任何狀態都有效, 包括在 Error 狀態的時候;

(5) 檢查 MediaPlayer 是否在播放

方法名稱public boolean isPlaying ();

方法解析 : 檢查 MediaPlayer 是否正在播放;

方法的有效狀態和無效狀態 : 除 Error 以外的所有狀態, 都可以檢視 MediaPlayer 是否在播放;

-- 有效狀態 : IdleInitialized, PreparedStartedPausedStoppedPlaybackCompleted, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Error 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態, 丟擲 IllegalStateException;

3. 狀態遷移相關方法

(1) 暫停播放

方法名稱public void pause ();

方法解析 : 暫停播放, 如果想要恢復播放的話, 呼叫 start() 方法;


方法的有效狀態和無效狀態 : 只有在 Started 和 Paused 狀態有效, Started 狀態呼叫該方法進入 Paused 狀態, Paused 狀態呼叫該方法不起作用;

-- 有效狀態 : StartedPaused, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Error , IdleInitialized, PreparedStoppedPlaybackCompleted 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態, 丟擲 IllegalStateException;

(2) 同步準備播放

方法名稱public void prepare ();

方法解析 : 這是個同步方法, 設定完資料來源播放載體之後呼叫該方法 或者 prepareAsync() 方法, 才能進行正常播放, 如果方法呼叫成功, 才能正常播放;

方法的有效狀態和無效狀態 : 只有在 Initialized 和 Stopped 狀態中會

-- 有效狀態 : Initialized, Stopped, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Idle, PreparedStartedPausedPlaybackCompletedError 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(3) 非同步準備播放

方法名稱public void prepareAsync ();

方法作用 : 非同步的方法, 讓播放器處於準備狀態;

-- 呼叫時機 : 設定完資料來源 和 播放載體 之後呼叫該方法;

-- 適用情況 : 對於 流媒體 來說, 呼叫該方法立即返回, 要比 阻塞等待緩衝足夠的資料在播放比較好;

方法的有效狀態和無效狀態 : 只有在 Initialized 和 Stopped 狀態中會

-- 有效狀態 : Initialized, Stopped, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : IdlePreparedStartedPausedPlaybackCompletedError 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(4) 釋放 MediaPlayer

方法名稱 : public void release ();

方法解析 : 釋放掉與 MediaPlayer 相關的資源;

-- 呼叫時機 : 在 MediaPlayer 播放的 Activity 暫停(pause) 停止(stop) 或者 銷燬(destroy)  的時候要呼叫該方法釋放 資源;


方法的有效狀態和無效狀態 : 在任何狀態下 呼叫 release() 方法都可以;

(5) 重置 MediaPlayer

方法名稱 public void reset ();

方法解析 : 重置 MediaPlayer 到 Idle 狀態, 此時還沒有設定資料來源, 如果想要播放媒體資源, 需要設定資料來源 和 呼叫 prepare()方法;

方法的有效狀態和無效狀態 : 在任何狀態下 呼叫 release() 方法都可以;

4. 設定資料來源相關方法

(1) 設定本地檔案路徑

方法名稱public void setDataSource (String path);

方法解析 : 設定一個 檔案路徑 或者 http/rtsp 地址 當做資料來源;

引數解析 : String path, 媒體資源的 檔案路徑 或者是 http/rtsp url 地址路徑;

方法的有效狀態和無效狀態 : 只有在 Idle 狀態下才能設定資料來源, 其它情況都會報錯;

-- 有效狀態 : Idle, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Initialized, PreparedStartedPausedStoppedPlaybackCompletedError,狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(2) 設定檔案描述符

方法名稱public void setDataSource (FileDescriptor fd);

方法解析 : 設定一個檔案描述符資源, 呼叫者應該注意關閉這個檔案描述符;

引數解析 : FileDescriptor sd, UNIX 系統的檔案描述, 相當與一個檔案;

方法的有效狀態和無效狀態 : 只有在 Idle 狀態下才能設定資料來源, 其它情況都會報錯;

-- 有效狀態 : Idle, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Initialized, PreparedStartedPausedStoppedPlaybackCompletedError, 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(3) 設定資料來源只擷取其中一段

方法名稱public void setDataSource (FileDescriptor fd, long offset, long length);

方法解析 : 設定一個檔案描述符資料來源, 這個檔案描述符檔案必須是可查詢的;

引數解析

-- FileDescriptor fd : 檔案描述符;

-- long offset : 檔案開始播放的位置, 這裡指的是位元組數;

-- long length : 檔案播放的大小, 位元組數;


方法的有效狀態和無效狀態 : 只有在 Idle 狀態下才能設定資料來源, 其它情況都會報錯;

-- 有效狀態 : Idle, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Initialized, PreparedStartedPausedStoppedPlaybackCompletedError, 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(4) 設定 Uri 路徑

方法名稱public void setDataSource (Context context, Uri uri);

方法介紹 : 設定一個 Uri 路徑當作資料來源;

引數介紹

-- Context context : Android 上下文物件;

-- Uri uri : 網路媒體檔案資料來源;


方法的有效狀態和無效狀態 : 只有在 Idle 狀態下才能設定資料來源, 其它情況都會報錯;

-- 有效狀態 : Idle, 在以上狀態呼叫該方法不會改變 MediaPlayer 狀態;

-- 無效狀態 : Initialized, PreparedStartedPausedStoppedPlaybackCompletedError, 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

5. 設定監聽器相關方法

注意 : 註冊監聽器相關方法在 MediaPlayer 的任何狀態都可以呼叫;

(1) 註冊緩衝變化相關監聽器

方法名稱public void setOnBufferingUpdateListener (MediaPlayer.OnBufferingUpdateListener listener);

方法作用 : 註冊一個在網路緩衝資料流發生變化後回撥的監聽器;

(2) 註冊播放完畢監聽器

方法名稱 : public void setOnCompletionListener (MediaPlayer.OnCompletionListener listener);

方法作用 : 註冊一個在媒體資源播放完畢之後回撥的播放事件;

(3) 註冊錯誤監聽器

方法名稱public void setOnErrorListener (MediaPlayer.OnErrorListener listener);

方法解析 : 註冊一個在非同步操作過程中發生錯誤回撥的監聽器;

(4) 註冊事件監聽器

方法名稱 : public void setOnInfoListener (MediaPlayer.OnInfoListener listener);

方法解析 : 註冊一個當有資訊 或者 警告出現就會回撥的監聽器;

(5) 註冊準備播放監聽器

方法名稱public void setOnPreparedListener (MediaPlayer.OnPreparedListener listener);

方法解析 : 註冊一個當媒體資源準備播放時回撥的監聽器;

(6) 註冊搜尋操作監聽器

方法名稱public void setOnSeekCompleteListener (MediaPlayer.OnSeekCompleteListener listener);

方法解析 : 註冊一個搜尋操作完成後回撥的監聽器;

(7) 註冊視訊大小改變監聽器

方法名稱public void setOnVideoSizeChangedListener (MediaPlayer.OnVideoSizeChangedListener listener);

方法解析 : 註冊一個 當視訊大小已知 或者 更新後 回撥的監聽器;

6. MediaPlayer 其它設定

(1) 指定音訊流型別

方法名稱 : public void setAudioStreamType (int streamtype);

方法解析 : 為 MediaPlayer 設定音訊流型別, 音訊型別在 AudioManager 中定義, 該方法必須在 prepare() 或者 prepareAsync() 方法之前呼叫;

方法的有效狀態和無效狀態 : 

-- 有效狀態 : IdleInitialized, PreparedStartedPausedStoppedPlaybackCompleted, 在以上狀態呼叫該方法會進入 Paused 狀態;

-- 無效狀態 : Error 狀態, 在 Error 狀態呼叫該方法, 會進入 Error 狀態中;

(2) 設定播放載體

方法名稱 public void setDisplay (SurfaceHolder sh);

方法解析 : 設定該媒體播放器的載體 SurfaceHolder, 如果要播放視訊必須設定該項 或者 setSurface() 中的任意一個, 如果播放音訊, 就不許要設定該該項, 如果播放視訊沒有設定該項, 那麼只會播放聲音;

方法的有效狀態和無效狀態 : 在任何狀態下都有效, 並且不會改變當前的執行狀態;

(3) 設定迴圈播放

方法名稱public void setLooping (boolean looping);

方法解析 :