91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Android如何使用MediaPlayer播放音頻

發布時間:2021-09-27 11:41:40 來源:億速云 閱讀:524 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Android如何使用MediaPlayer播放音頻”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Android如何使用MediaPlayer播放音頻”這篇文章吧。

主要介紹使用MediaPlayer播放音頻的方式。關于MediaPlayer的基礎知識,比如狀態,可以參考Android MediaPlayer基礎簡介。

為了方便表達,定義變量名為mediaPlayer。

MediaPlayer的使用方式

創建MediaPlayer

可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法創建。

mediaPlayer = new MediaPlayer();

使用create方法創建成功后,mediaPlayer處于Prepared狀態。可以直接start播放。

mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));mediaPlayer.start();

設置音源 - setDataSource

通過調用setDataSource來設置音源。setDataSource有多個重載方法,我們來看常用的幾種。

例如設置使用assets里的資源。實際情況可能需要try catch。

AssetFileDescriptor fd = null;MediaPlayer mediaPlayer = new MediaPlayer();fd = context.getApplicationContext().getAssets().openFd(name);mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());

本地文件,需要文件的絕對路徑。

mediaPlayer.setDataSource(file.getAbsolutePath());

或者獲取文件的Uri來創建mediaPlayer。

mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));

設置網絡音頻,也是用setDataSource方法,設置url。

mediaPlayer.setDataSource("https://demo.com/sample.mp3"));

播放網絡音頻時,如果使用的是http,有可能會報錯

java.io.IOException: Cleartext HTTP traffic to demo.com not permitted

可以簡單地設置一下manifest,設置usesCleartextTraffic=”true”

<application android:usesCleartextTraffic="true">

準備 - prepare

同步和異步準備音頻資源。prepareAsync()是異步的方式,prepare是同步的。注意線程調度問題,同時不要阻塞UI線程。

使用異步方式準備音頻,經常與MediaPlayer.OnPreparedListener監聽器配合使用。異步準備時,也可以進行其他的設置。

mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); // 準備好了就播放 }});

循環播放 - Looping

設置循環播放setLooping。

mediaPlayer.setLooping(true);

播放完畢后,不會回調OnCompletionListener,而是從頭播放當前音頻。

播放 - start

播放音頻,調用start方法。

mediaPlayer.start();

處于Prepared,Pause和PlaybackComplete狀態時,可以調用start方法,進入Started狀態。

暫停 - pause

暫停播放,使用pause方法。在暫停前先判斷一下mediaPlayer的是否在播放。

if (mediaPlayer.isPlaying()) { mediaPlayer.pause();}

暫停成功則處于Paused狀態。

停止 - stop

回顧一下MediaPlayer狀態切換的圖示,我們可以得知在播放中,暫停,播放完成這3個狀態下,可以調用stop方法,進入Stopped狀態。

mediaPlayer.stop();

調進度 - seekTo

調整播放進度。我們平時使用音樂播放軟件一般都會有這個功能。seekTo方法接受一個毫秒參數。

int targetMS = (int) (percent * mediaPlayer.getDuration());mediaPlayer.seekTo(targetMS);

seekTo并不會改變MediaPlayer的狀態。

int targetMS = (int) (percent * mediaPlayer.getDuration());mediaPlayer.seekTo(targetMS);

reset后的mediaPlayer進入Idle狀態。需要重新設置音源與準備。

釋放 - release

不再使用這個mediaPlayer時,應當盡快釋放掉,以釋放相關的資源。

調用release后,mediaPlayer進入End狀態。此時這個mediaPlayer就不能再使用了。

常用監聽器

緩沖監聽器 OnBufferingUpdateListener

比如我們加載網絡音頻的時候,常用這個監聽器來監聽緩沖進度。顯示緩沖進度,也可以提高用戶體驗。

mMediaPlayer.prepareAsync();mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // percent代表緩沖百分比 }});

錯誤監聽器 OnErrorListener

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { return true; // 返回true表示在此處理錯誤,不會回調onCompletion }});

注意onError的返回值。可以選擇自己處理error。

* @return True if the method handled the error, false if it didn't. * Returning false, or not having an OnErrorListener at all, will * cause the OnCompletionListener to be called. */boolean onError(MediaPlayer mp, int what, int extra);

播放完畢監聽器 OnCompletionListener

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { // 播放完畢 }});

使用示例

播放assets里的音頻

播放assets里的音頻文件,使用到AssetFileDescriptor類。使用后記得關閉AssetFileDescriptor。

private void playAssetsAudio(final String name, Context context) { Log.d(TAG, "playAssetWordSound: try to play assets sound file. -> " + name); AssetFileDescriptor fd = null; try { MediaPlayer mediaPlayer; Log.v(TAG, "Looking in assets."); fd = context.getApplicationContext().getAssets().openFd(name); mediaPlayer = new MediaPlayer(); mediaPlayer.reset(); mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength()); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {  @Override  public void onPrepared(MediaPlayer mediaPlayer) {  Log.d(TAG, "onPrepared: " + name);  mediaPlayer.start();  } }); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  @Override  public void onCompletion(MediaPlayer mp) {  mp.release();  Log.d(TAG, "onCompletion: " + name);  } }); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {  @Override  public boolean onError(MediaPlayer mp, int i, int i1) {  mp.release();  return true;  } }); } catch (Exception e) { try {  if (fd != null) {  fd.close();  } } catch (Exception e1) {  Log.e(TAG, "Exception close fd: ", e1); } } finally { if (fd != null) {  try {  fd.close();  } catch (IOException e) {  Log.e(TAG, "Finally, close fd ", e);  } } }}

播放本地音頻文件

嘗試播放音頻文件。僅播放一次。

private void playAudioFile(final File file) { Log.d(TAG, "playAudioFile: " + file.getAbsolutePath()); MediaPlayer mediaPlayer; try { mediaPlayer = new MediaPlayer(); mediaPlayer.setLooping(false); mediaPlayer.setDataSource(file.getAbsolutePath()); mediaPlayer.prepare(); mediaPlayer.start(); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  @Override  public void onCompletion(MediaPlayer mp) {  mp.release();  } }); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {  @Override  public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {  Log.d(TAG, "Play local sound onError: " + i + ", " + i1);  return true;  } }); } catch (Exception e) { Log.e(TAG, "playAudioFile: ", e); }}

播放在線音頻

設置url,播放在線音頻

private void playOnlineSound(String soundUrlDict) { try { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(soundUrlDict); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {  @Override  public void onPrepared(MediaPlayer mediaPlayer) {  mediaPlayer.start();  } }); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  @Override  public void onCompletion(MediaPlayer mp) {  if (mp != null) {   mp.release();  }  Log.d(TAG, "onCompletion: play sound.");  } }); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {  @Override  public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {  Log.d(TAG, "Play online sound onError: " + i + ", " + i1);  return false;  } }); } catch (IOException e1) { Log.e(TAG, "url: ", e1); }}

以上是“Android如何使用MediaPlayer播放音頻”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

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

AI

石城县| 射洪县| 双峰县| 霍林郭勒市| 淮安市| 青冈县| 张家川| 石首市| 上蔡县| 昭通市| 诸暨市| 乐亭县| 象州县| 长春市| 金川县| 闽侯县| 侯马市| 瑞昌市| 驻马店市| 措美县| 开鲁县| 嫩江县| 灵山县| 东莞市| 蒙山县| 黄平县| 炉霍县| 揭东县| 钟祥市| 铜川市| 湾仔区| 县级市| 那曲县| 谢通门县| 大荔县| 中卫市| 包头市| 斗六市| 洪江市| 额济纳旗| 宜宾市|