Android MediaPlayer 音頻的方式
主要介紹使用MediaPlayer 音頻的方式。關于MediaPlayer的基礎知識,比如狀態(tài),可以參考Android MediaPlayer 基礎簡介。
為了方便表達,定義變量名為mediaPlayer。
MediaPlayer的使用方式
創(chuàng)建MediaPlayer
可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法創(chuàng)建。
mediaPlayer = new MediaPlayer();
使用create方法創(chuàng)建成功后,mediaPlayer處于Prepared狀態(tài)??梢灾苯觭tart 。
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來創(chuàng)建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
監(jiān)聽器配合使用。異步準備時,也可以進行其他的設置。
mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); // 準備好了就 } });
循環(huán) - Looping
設置循環(huán) setLooping。
mediaPlayer.setLooping(true);
完畢后,不會回調OnCompletionListener,而是從頭 當前音頻。
- start
音頻,調用start方法。
mediaPlayer.start();
處于Prepared,Pause和PlaybackComplete狀態(tài)時,可以調用start方法,進入Started狀態(tài)。
暫停 - pause
暫停 ,使用pause方法。在暫停前先判斷一下mediaPlayer的是否在 。
if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); }
暫停成功則處于Paused狀態(tài)。
停止 - stop
回顧一下MediaPlayer狀態(tài)切換的圖示,我們可以得知在 中,暫停, 完成這3個狀態(tài)下,可以調用stop方法,進入Stopped狀態(tài)。
mediaPlayer.stop();
調進度 - seekTo
調整 進度。我們平時使用音樂 軟件一般都會有這個功能。
seekTo方法接受一個毫秒參數(shù)。
int targetMS = (int) (percent * mediaPlayer.getDuration()); mediaPlayer.seekTo(targetMS);
seekTo并不會改變MediaPlayer的狀態(tài)。
int targetMS = (int) (percent * mediaPlayer.getDuration()); mediaPlayer.seekTo(targetMS);
reset后的mediaPlayer進入Idle狀態(tài)。需要重新設置音源與準備。
釋放 - release
不再使用這個mediaPlayer時,應當盡快釋放掉,以釋放相關的資源。
調用release后,mediaPlayer進入End狀態(tài)。此時這個mediaPlayer就不能再使用了。
常用監(jiān)聽器
緩沖監(jiān)聽器 OnBufferingUpdateListener
比如我們加載網絡音頻的時候,常用這個監(jiān)聽器來監(jiān)聽緩沖進度。顯示緩沖進度,也可以提高用戶體驗。
mMediaPlayer.prepareAsync(); mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // percent代表緩沖百分比 } });
錯誤監(jiān)聽器 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);
完畢監(jiān)聽器 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); } }
代碼可以參考示例工程: https://github.com/RustFisher/android-MediaPlayer
總結
以上所述是小編給大家介紹的Android MediaPlayer 音頻的方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對我們網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
上一篇:Android使用MediaPlayer和TextureView實現(xiàn)視頻無縫切換
欄 目:Android
下一篇:Android 使用URLConnection下載音頻文件的方法
本文標題:Android MediaPlayer 音頻的方式
本文地址:http://mengdiqiu.com.cn/a1/Android/9171.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應用實現(xiàn)方法詳解
- 01-10android實現(xiàn)記住用戶名和密碼以及自動登錄
- 01-10android實現(xiàn)簡單計算器功能
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代碼
- 01-10android實現(xiàn)指紋識別功能
- 01-10Emoji表情在Android JNI中的兼容性問題詳解
- 01-10Android實現(xiàn)圓形漸變加載進度條
- 01-10android開發(fā)環(huán)境中SDK文件夾下的所需內容詳解
- 01-10android異步消息機制 源碼層面徹底解析(1)


閱讀排行
本欄相關
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應用實現(xiàn)方
- 01-10android實現(xiàn)簡單計算器功能
- 01-10android實現(xiàn)記住用戶名和密碼以及自動
- 01-10C++自定義API函數(shù)實現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代
- 01-10android實現(xiàn)指紋識別功能
- 01-10如何給Flutter界面切換實現(xiàn)點特效
- 01-10Android實現(xiàn)圓形漸變加載進度條
- 01-10Emoji表情在Android JNI中的兼容性問題詳
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改