溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

發(fā)布時間:2021-08-05 14:39:45 來源:億速云 閱讀:161 作者:小新 欄目:移動開發(fā)

這篇文章主要為大家展示了“Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析”這篇文章吧。

一. MediaPlayer 狀態(tài)機 介紹

Android MediaPlayer 狀態(tài)即圖例 :

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

1. Idle (閑置) 狀態(tài) 和 End (結束) 狀態(tài)

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

MediaPlayer 對象聲明周期 : 從 Idle 到 End 狀態(tài)就是 MediaPlayer 整個生命周期;

-- 生命周期開始 : 進入 Idle (閑置) 狀態(tài);
-- 生命周期結束 : 進入 End (結束) 狀態(tài);

Idle 和 End 狀態(tài)轉換 :

-- 進入 Idle 狀態(tài) : MediaPlayer 剛被創(chuàng)建 new MediaPlayer() 或者 調用了 reset() 方法之后, 進入 Idle (閑置) 狀態(tài);
-- 進入 End 狀態(tài) : 在 Idle 狀態(tài)調用 release() 方法后, 會進入 End (結束) 狀態(tài);

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

-- new MediaPlayer() 進入 Idle 狀態(tài) : 此時 MediaPlayer 內部引擎 和 狀態(tài)都沒有改變, 調用上面的方法之后, 將 無法調用

OnErrorListener.onError() 方法;

-- reset() 進入 Idle 狀態(tài) :  此時如果調用上面的方法, 內部的引擎就會 回調 OnErrorListener.onError() 方法;

創(chuàng)建 和 重載 MediaPlayer 區(qū)別 :

-- 創(chuàng)建 MediaPlayer : 通過 new MediaPlayer() 創(chuàng)建的對象處于 Idle (閑置) 狀態(tài);
-- 重載 MediaPlayer : 通過 create() 方法創(chuàng)建的 MediaPlayer 對象處于 Prepare (準備) 狀態(tài);

End (結束) 狀態(tài)解析 :

-- release() 方法作用 : 該方法會釋放 播放引擎 中與 MediaPlayer 相關的資源;
-- 釋放唯一性資源 : 有些資源如 硬件加速組件 單態(tài)組件等都是唯一性的資源, 如果不釋放掉, 之后的 Mediaplayer 都無法正常運行;
-- 無法進行狀態(tài)轉換 : End 狀態(tài)代表 MediaPlayer 生命周期結束, 在此狀態(tài)不能轉換成其它狀態(tài)了;

2. Error (錯誤) 狀態(tài)

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

Error 狀態(tài)轉換 : 當 MediaPlayer 出現(xiàn)一些錯誤如 格式錯誤, 分辨率過高等原因, 播放器引擎 就會調用 OnErrorListener.onError()方法;

-- 進入 Error 狀態(tài) : 客戶端調用 OnErrorListener.onError() 方法, 會進入 Error 狀態(tài);
-- 離開 Error 狀態(tài) : 如果想要使用進入 Error 狀態(tài)的 MediaPlayer, 可以使用 reset() 方法進入 Idle 狀態(tài);

注冊監(jiān)聽 : 編程注冊一個 OnErrorListener 監(jiān)聽器, 用于獲取 播放器引擎 內部發(fā)生的錯誤;

-- 注冊方法 : 調用 MediaPlayer.setOnErrorListener(OnErrorListener) 方法, 注冊 OnErrorListener;

關于一些異常拋出 : 在不合法的地方調用方法, 會拋出 IllegalStateException 異常;

3. Initalized (初始化) 狀態(tài)

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

Initialized 狀態(tài)轉換 : 在 Idle 狀態(tài)調用 setDataSource() 方法, MediaPlayer 會遷移到 Initialized 狀態(tài);
-- 注意 : 只能是在 Idle 狀態(tài)調用該方法, 如果在其它狀態(tài)調用該方法, 會報出 IllegalStateException 異常;

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

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

Prepared (就緒) 狀態(tài)轉換 :

-- 從 Initialized 狀態(tài)遷移 : 在 Initialized 狀態(tài)調用 prepare() 方法, 如果方法成功返回, MediaPlayer 就會進入 Prepared 狀態(tài);
-- 從 Preparing 狀態(tài)遷移 : 在 Preparing 狀態(tài)調用 OnPrepareListener.onPrepared() 方法遷移到 Prepared 狀態(tài);

Preparing (準備中) 狀態(tài) : Initialized 狀態(tài)調用 prepareAsync() 方法進入 Preparing 狀態(tài);

-- 該狀態(tài)執(zhí)行的操作 : 在 Preparing 狀態(tài)時, 播放器引擎會繼續(xù)完成準備工作, 同步版本返回 或者 異步版本準備工作完成就會調用  OnPrepareListener.onPrepared() 方法進入 Prepared 狀態(tài);

拋出異常 : 只有在 Initialized 方法中才能調用 prepare() 和 prepareAsync()方法, 在其它狀態(tài)調用會報出 IllegalStateException 遺產;

Prepared 狀態(tài) MediaPlayer 可進行的操作 : 在這個狀態(tài) MediaPlayer 可以進行 音頻視頻屬性 循環(huán)屬性等操作;

5. Started (開始) 狀態(tài)

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

Started 狀態(tài)遷移 : 在 Prepared 狀態(tài)調用 start() 方法, MediaPlayer 即遷移到了 Started 狀態(tài);

-- 判斷 MediaPlayer 是否在 Started 狀態(tài) : 在任何狀態(tài)下調用 isPlaying() 方法, 可以判斷 MediaPlayer 是否在 Started 狀態(tài);
-- 跟蹤緩沖狀態(tài) : 在 Started 狀態(tài), 調用 OnBufferingUpdateListener.onBufferingUpdate() 方法, 可以獲取視頻音頻流的緩沖狀態(tài);

6. Paused (暫停) 狀態(tài)

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

Paused (暫停) 狀態(tài)遷移 : 在 Started 狀態(tài)調用 pause() 方法, MediaPlayer 會進入 Paused 狀態(tài);

-- 狀態(tài)遷移時間 : Started 狀態(tài)轉換為 Paused 狀態(tài)需要一定時間, 這個過程是異步的, 過一段時間之后 isPlaying() 狀態(tài)才會改變;
-- 回到 Started 狀態(tài) : 在 Paused 狀態(tài)調用 start() 方法, 會進入 Started 狀態(tài);

7. Stopped (停止) 狀態(tài)

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

Stopped 狀態(tài)遷移 : 在 Prepared, Started, Paused, PlaybackCompleted 狀態(tài)下 調用 stop() 方法, MediaPlayer 會遷移到 Stopped 狀態(tài);

8. 播放位置調整

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析     Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析     Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析      

seekTo() 方法說明 : 該方法異步, 調用后 播放器引擎還需要進行其它操作, 跳轉才能完成;

-- 進行的操作 : 播放器引擎會回調 OnSeekComplete.onSeekComplete()方法, 該方法通過 setOnSeekCompleteListener() 方法注冊;
-- seekTo() 方法調用狀態(tài) : 該方法可以在 Prepared, Paused, PlaybackCompleted 狀態(tài)進行調用;
-- 獲取播放位置 : 調用 getCurrentPosition() 方法, 可以獲取當前播放的位置, 可以幫助播放器更新進度條;

9. PlaybackCompleted (播放完畢) 狀態(tài)

Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析

循環(huán)模式開啟 : 如果之前使用了 setLooping() 開啟了循環(huán)模式, 播放完畢之后 MediaPlayer 會重新進入 Started 狀態(tài);

PlaybackCompleted 狀態(tài)遷移 : 如果沒有設置循環(huán)模式, 那么播放完畢之后會調用 OnCompletion.onCompletion() 回調方法, MediaPlayer 會進入 PlaybackCompleted 狀態(tài);

-- OnCompletion注冊 : 調用 MediaPlayer.setOnCompletionListener() 注冊該監(jiān)聽器;
-- 進入 Started 狀態(tài)方法 : 在 PlaybackCompleted 狀態(tài)時, 調用 satrt() 方法可以進入 Started 狀態(tài);

二. MediaPlayer 接口 和 常量

1. MediaPlayer 接口

(1) 緩沖相關接口

接口介紹 :

-- 接口名稱 : MediaPlayer.OnBufferingUpdateListener;
-- 接口作用 : 定義一個回調接口, 該接口的作用是在流媒體緩沖狀態(tài)發(fā)生改變的時候, 標明該狀態(tài);

接口方法介紹 :

-- 接口方法 :
public abstract void onBufferingUpdate (MediaPlayer mp, int percent) 
-- 方法作用 : 該方法在 MediaPlayer 通過 HTTP 下載緩沖視頻流的時候回調, 用以改變視頻緩沖狀態(tài);
-- 方法參數(shù) : mp 即 MediaPlayer 實體對象; percent 已經緩沖了的 或者 播放了的 媒體流百分比;

(2) 播放完畢相關接口

接口介紹 :

-- 接口名稱 : MediaPlayer.OnCompletionListener;
-- 接口作用 : 在接口中定義了 流媒體 播放完畢后回調的方法;

接口方法介紹 :

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

(3) 錯誤相關接口

接口介紹 :

-- 接口名稱 : MediaPlayer.OnErrorListener;
-- 接口作用 : 在該接口中定義回調方法, 在異步操作中出現(xiàn)錯誤時會回調該方法, 其它情況下出現(xiàn)錯誤時直接拋出異常;

接口方法介紹 :

-- 接口方法 :
public abstract boolean onError (MediaPlayer mp, int what, int extra) 
-- 方法作用 : 異步操作中出現(xiàn)錯誤時回調該方法;
-- 參數(shù)介紹 :
--- a. MediaPlayer mp : MediaPlayer 實體類;
--- b. int what : 出現(xiàn)的錯誤類型, 如
MEDIA_ERROR_UNKONWN(位置錯誤) 或者
MEDIA_ERROR_SERVER_DIED(服務器錯誤) ;
--- c. int extra : 針對與具體錯誤的附加碼, 用于定位錯誤更詳細信息, 例如
MEDIA_ERROR_IO(本地文件或網(wǎng)絡相關錯誤),
MEDIA_ERROR_MALFORMAD (比特流不符合相關的編碼標準和文件規(guī)范),
MEDIA_ERROR_UNSUPPORTED(框架不支持該功能),
MEDIA_ERROR_TIME_OUT(一些操作超時);

-- 方法執(zhí)行結果 : 成功處理錯誤返回 true, 處理失敗返回 false, 如果沒有設定針對該方法的監(jiān)聽器, 直接調用 OnCompletionListener 監(jiān)聽器;

(4) 信息相關接口

接口介紹 :

-- 接口名稱 : MediaPlayer.OnInfoListener;
-- 接口作用 : 該接口定義了一個回調方法, 該方法在媒體播放時出現(xiàn)信息或者警告時回調該方法;

接口方法介紹 :

-- 接口方法 :

public abstract boolean onInfo (MediaPlayer mp, int what, int extra) 
-- 方法作用 : 出現(xiàn)了信息或者警告的時候回調;
-- 參數(shù)介紹 :
--- a. MediaPlayer mp : MediaPlayer 實體對象;

--- b. int what : 信息或者警告的類型, 如
MEDIA_INFO_UNKNOWN(未知的信息),
MEDIA_INFO_VEDIO_TRACK_LAGGING(視頻過于復雜解碼太慢),
MEDIA_INFO_VEDIO_RENDERING_START(開始渲染第一幀),
MEDIA_INFO_BUFFRING_START(暫停播放開始緩沖更多數(shù)據(jù)),
MEDIA_INFO_BUFFERING_END(緩沖了足夠的數(shù)據(jù)重新開始播放),
MEDIA_INFO_BAD_INTERLEAVING(錯誤交叉),
MEDIA_INFO_NOT_SEEKABLE(媒體不能夠搜索),
MEDIA_INFO_METADATA_UPDATE(一組新的元數(shù)據(jù)用),
MEDIA_INFO_UNSUPPORTED_SUBTITLE(不支持字幕),
MEDIA_INFO_SUBTITLE_TIMED_OUT(讀取字幕使用時間過長);
--- c. int extra : 信息或者警告的類型,

-- 返回值 : 如果處理了信息就會返回 true, 沒有處理返回false, 如果沒有注冊該監(jiān)聽, 就會忽略該信息;

(5) 準備播放相關接口

接口介紹 :

-- 接口名稱 : MediaPlayer.OnPreparedListener;
-- 接口作用 : 該接口中定義一個回調方法, 該方法在進入 Prepared 狀態(tài) 并 開始播放的時候回調;

接口方法介紹 :

-- 接口方法 :

public abstract void onPrepared (MediaPlayer mp) 
-- 方法作用 : 該方法在進入 Prepared 狀態(tài) 并 開始播放的時候回調;
-- 參數(shù)介紹 : 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;
-- 參數(shù)解析 : int width 視頻的寬度, int height 視頻的高度;

三. MediaPlayer 常用方法解析

1. MediaPlayer 構造方法

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

(1) 默認構造方法

方法名稱 : public MediaPlayer ();

public MediaPlayer () 

方法簡介 : 默認構造方法, 創(chuàng)建的 MediaPlayer 自動進入 Idle 狀態(tài), 不同于 create() 方法, 創(chuàng)建的 MediaPlayer 自動進入 Prepared 狀態(tài);

-- 兩種方法比較 : 因為 create() 方法創(chuàng)建的時候就指定了數(shù)據(jù)源, 不用在 Idle 狀態(tài)設置數(shù)據(jù), 并調用 prepare() 方法了;

(2) 指定uri的構造方法

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

public static MediaPlayer create (Context context, Uri uri) 

方法簡介 : 根據(jù)給定的 Uri 創(chuàng)建一個 MediaPlayer 對象, 如果創(chuàng)建成功, 其內部會自動調用 prepare() 方法, 不同再自己調用一次, MediaPlayer 使用完畢之后要使用 release()方法, 否則會出錯;

返回值 : 如果創(chuàng)建成功返回 MediaPlayer 對象, 如果創(chuàng)建失敗返回 null;

參數(shù)介紹 :

-- Context context : android 的上下文對象;
-- Uri uri : 數(shù)據(jù)源的 Uri;

(3) 指定資源 id

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

public static MediaPlayer create (Context context, int resid) 

方法簡介 : 通過給定的 raw 資源 id, 創(chuàng)建 MediaPlayer 對象;

參數(shù)介紹 : 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) 

方法簡介 : 創(chuàng)建一個 MediaPlayer, 指定 MediaPlayer 數(shù)據(jù)源 Uri 和 SurfaceView 對象;

參數(shù)介紹 :

-- Context context : Android 的上下文對象;
-- Uri uri : 指定的網(wǎng)絡媒體的數(shù)據(jù)源;
-- SurfaceHolder holder : 指定要播放視頻的 SurfaceHolder ;

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

(1) 獲取當前位置

方法名稱 : public int getCurrentPosition ();

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

方法的有效狀態(tài)和無效狀態(tài) :

-- 有效狀態(tài) : Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Error 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(2) 獲取文件時長

方法名稱 : public int getDuration ();

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

方法的有效狀態(tài)和無效狀態(tài) : 設置數(shù)據(jù)源之后的非錯誤狀態(tài) 才可以獲取播放文件時長;

-- 有效狀態(tài) : Prepared, Started, Paused, Stopped, PlaybackCompleted, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Idle, Initialized, Error 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(3) 獲取視頻高度 寬度

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

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

方法的有效狀態(tài)和無效狀態(tài) : 除 Error 以外的所有狀態(tài);

-- 有效狀態(tài) : Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Error 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(4) 檢查 MediaPlayer 是否在循環(huán)

方法名稱 : public boolean isLooping ();

方法解析 : 檢查 MediaPlayer 是否在循環(huán)播放, 如果是 返回 true, 不是的話 返回 false;

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

(5) 檢查 MediaPlayer 是否在播放

方法名稱 : public boolean isPlaying ();

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

方法的有效狀態(tài)和無效狀態(tài) : 除 Error 以外的所有狀態(tài), 都可以查看 MediaPlayer 是否在播放;

-- 有效狀態(tài) : Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Error 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài), 拋出 IllegalStateException;

3. 狀態(tài)遷移相關方法

(1) 暫停播放

方法名稱 : public void pause ();

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

方法的有效狀態(tài)和無效狀態(tài) : 只有在 Started 和 Paused 狀態(tài)有效, Started 狀態(tài)調用該方法進入 Paused 狀態(tài), Paused 狀態(tài)調用該方法不起作用;

-- 有效狀態(tài) : Started, Paused, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Error , Idle, Initialized, Prepared, Stopped, PlaybackCompleted 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài), 拋出 IllegalStateException;

(2) 同步準備播放

方法名稱 : public void prepare ();

方法解析 : 這是個同步方法, 設置完數(shù)據(jù)源 和 播放載體之后調用該方法 或者 prepareAsync() 方法, 才能進行正常播放, 如果方法調用成功, 才能正常播放;

方法的有效狀態(tài)和無效狀態(tài) : 只有在 Initialized 和 Stopped 狀態(tài)中會
-- 有效狀態(tài) : Initialized, Stopped, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Idle, Prepared, Started, Paused, PlaybackCompleted, Error 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(3) 異步準備播放

方法名稱 : public void prepareAsync ();

方法作用 : 異步的方法, 讓播放器處于準備狀態(tài);

-- 調用時機 : 設置完數(shù)據(jù)源 和 播放載體 之后調用該方法;
-- 適用情況 : 對于 流媒體 來說, 調用該方法立即返回, 要比 阻塞等待緩沖足夠的數(shù)據(jù)在播放比較好;

方法的有效狀態(tài)和無效狀態(tài) : 只有在 Initialized 和 Stopped 狀態(tài)中會

-- 有效狀態(tài) : Initialized, Stopped, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Idle, Prepared, Started, Paused, PlaybackCompleted, Error 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(4) 釋放 MediaPlayer

方法名稱 : public void release ();

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

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

方法的有效狀態(tài)和無效狀態(tài) : 在任何狀態(tài)下 調用 release() 方法都可以;

(5) 重置 MediaPlayer

方法名稱 : public void reset ();

方法解析 : 重置 MediaPlayer 到 Idle 狀態(tài), 此時還沒有設置數(shù)據(jù)源, 如果想要播放媒體資源, 需要設置數(shù)據(jù)源 和 調用 prepare()方法;

方法的有效狀態(tài)和無效狀態(tài) : 在任何狀態(tài)下 調用 release() 方法都可以;

4. 設置數(shù)據(jù)源相關方法

(1) 設置本地文件路徑

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

方法解析 : 設置一個 文件路徑 或者 http/rtsp 地址 當做數(shù)據(jù)源;

參數(shù)解析 : String path, 媒體資源的 文件路徑 或者是 http/rtsp url 地址路徑;

方法的有效狀態(tài)和無效狀態(tài) : 只有在 Idle 狀態(tài)下才能設置數(shù)據(jù)源, 其它情況都會報錯;

-- 有效狀態(tài) : Idle, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error, 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(2) 設置文件描述符

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

方法解析 : 設置一個文件描述符資源, 調用者應該注意關閉這個文件描述符;

參數(shù)解析 : FileDescriptor sd, UNIX 系統(tǒng)的文件描述, 相當與一個文件;

方法的有效狀態(tài)和無效狀態(tài) : 只有在 Idle 狀態(tài)下才能設置數(shù)據(jù)源, 其它情況都會報錯;

-- 有效狀態(tài) : Idle, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error, 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(3) 設置數(shù)據(jù)源只截取其中一段

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

方法解析 : 設置一個文件描述符數(shù)據(jù)源, 這個文件描述符文件必須是可查詢的;

參數(shù)解析 :

-- FileDescriptor fd : 文件描述符;
-- long offset : 文件開始播放的位置, 這里指的是字節(jié)數(shù);
-- long length : 文件播放的大小, 字節(jié)數(shù);

方法的有效狀態(tài)和無效狀態(tài) : 只有在 Idle 狀態(tài)下才能設置數(shù)據(jù)源, 其它情況都會報錯;

-- 有效狀態(tài) : Idle, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error, 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(4) 設置 Uri 路徑

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

方法介紹 : 設置一個 Uri 路徑當作數(shù)據(jù)源;

參數(shù)介紹 :

-- Context context : Android 上下文對象;
-- Uri uri : 網(wǎng)絡媒體文件數(shù)據(jù)源;

方法的有效狀態(tài)和無效狀態(tài) : 只有在 Idle 狀態(tài)下才能設置數(shù)據(jù)源, 其它情況都會報錯;

-- 有效狀態(tài) : Idle, 在以上狀態(tài)調用該方法不會改變 MediaPlayer 狀態(tài);
-- 無效狀態(tài) : Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error, 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

5. 設置監(jiān)聽器相關方法

注意 : 注冊監(jiān)聽器相關方法在 MediaPlayer 的任何狀態(tài)都可以調用;

(1) 注冊緩沖變化相關監(jiān)聽器

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

方法作用 : 注冊一個在網(wǎng)絡緩沖數(shù)據(jù)流發(fā)生變化后回調的監(jiān)聽器;

(2) 注冊播放完畢監(jiān)聽器

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

方法作用 : 注冊一個在媒體資源播放完畢之后回調的播放事件;

(3) 注冊錯誤監(jiān)聽器

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

方法解析 : 注冊一個在異步操作過程中發(fā)生錯誤回調的監(jiān)聽器;

(4) 注冊事件監(jiān)聽器

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

方法解析 : 注冊一個當有信息 或者 警告出現(xiàn)就會回調的監(jiān)聽器;

(5) 注冊準備播放監(jiān)聽器

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

方法解析 : 注冊一個當媒體資源準備播放時回調的監(jiān)聽器;

(6) 注冊搜尋操作監(jiān)聽器

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

方法解析 : 注冊一個搜尋操作完成后回調的監(jiān)聽器;

(7) 注冊視頻大小改變監(jiān)聽器

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

方法解析 : 注冊一個 當視頻大小已知 或者 更新后 回調的監(jiān)聽器;

6. MediaPlayer 其它設置

(1) 指定音頻流類型

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

方法解析 : 為 MediaPlayer 設置音頻流類型, 音頻類型在 AudioManager 中定義, 該方法必須在 prepare() 或者 prepareAsync() 方法之前調用;

方法的有效狀態(tài)和無效狀態(tài) :

-- 有效狀態(tài) : Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, 在以上狀態(tài)調用該方法會進入 Paused 狀態(tài);
-- 無效狀態(tài) : Error 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(2) 設定播放載體

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

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

方法的有效狀態(tài)和無效狀態(tài) : 在任何狀態(tài)下都有效, 并且不會改變當前的運行狀態(tài);

(3) 設置循環(huán)播放

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

方法解析 : 設置播放器是否循環(huán)播放;

方法的有效狀態(tài)和無效狀態(tài) :

-- 有效狀態(tài) : Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, 在以上狀態(tài)調用該方法不會改變當前狀態(tài);
-- 無效狀態(tài) : Error 狀態(tài), 在 Error 狀態(tài)調用該方法, 會進入 Error 狀態(tài)中;

(4) 設置是否保持屏幕

方法名稱 : public void setScreenOnWhilePlaying (boolean screenOn);

方法解析: 設置在視頻播放的時候是否使用 SurfaceHolder 保持屏幕亮起;

方法的有效狀態(tài)和無效狀態(tài) : 任何狀態(tài)都可調用, 并且不會改變當前狀態(tài);

(5) 設置電源管理狀態(tài)

方法名稱 : public void setWakeMode (Context context, int mode);

方法解析 : 為 MediaPlayer 設置電源管理狀態(tài);

方法的有效狀態(tài)和無效狀態(tài) : 任何狀態(tài)都可調用, 并且不會改變當前狀態(tài);

以上是“Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI