您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Android如何使用MediaPlayer播放音頻”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Android如何使用MediaPlayer播放音頻”這篇文章吧。
主要介紹使用MediaPlayer播放音頻的方式。關(guān)于MediaPlayer的基礎(chǔ)知識,比如狀態(tài),可以參考Android MediaPlayer基礎(chǔ)簡介。
為了方便表達(dá),定義變量名為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();
設(shè)置音源 - setDataSource
通過調(diào)用setDataSource來設(shè)置音源。setDataSource有多個(gè)重載方法,我們來看常用的幾種。
例如設(shè)置使用assets里的資源。實(shí)際情況可能需要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));
設(shè)置網(wǎng)絡(luò)音頻,也是用setDataSource方法,設(shè)置url。
mediaPlayer.setDataSource("https://demo.com/sample.mp3"));
播放網(wǎng)絡(luò)音頻時(shí),如果使用的是http,有可能會(huì)報(bào)錯(cuò)
java.io.IOException: Cleartext HTTP traffic to demo.com not permitted
可以簡單地設(shè)置一下manifest,設(shè)置usesCleartextTraffic=”true”
<application android:usesCleartextTraffic="true">
準(zhǔn)備 - prepare
同步和異步準(zhǔn)備音頻資源。prepareAsync()
是異步的方式,prepare是同步的。注意線程調(diào)度問題,同時(shí)不要阻塞UI線程。
使用異步方式準(zhǔn)備音頻,經(jīng)常與MediaPlayer.OnPreparedListener
監(jiān)聽器配合使用。異步準(zhǔn)備時(shí),也可以進(jìn)行其他的設(shè)置。
mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); // 準(zhǔn)備好了就播放 }});
循環(huán)播放 - Looping
設(shè)置循環(huán)播放setLooping。
mediaPlayer.setLooping(true);
播放完畢后,不會(huì)回調(diào)OnCompletionListener,而是從頭播放當(dāng)前音頻。
播放 - start
播放音頻,調(diào)用start方法。
mediaPlayer.start();
處于Prepared,Pause和PlaybackComplete狀態(tài)時(shí),可以調(diào)用start方法,進(jìn)入Started狀態(tài)。
暫停 - pause
暫停播放,使用pause方法。在暫停前先判斷一下mediaPlayer的是否在播放。
if (mediaPlayer.isPlaying()) { mediaPlayer.pause();}
暫停成功則處于Paused狀態(tài)。
停止 - stop
回顧一下MediaPlayer狀態(tài)切換的圖示,我們可以得知在播放中,暫停,播放完成這3個(gè)狀態(tài)下,可以調(diào)用stop方法,進(jìn)入Stopped狀態(tài)。
mediaPlayer.stop();
調(diào)進(jìn)度 - seekTo
調(diào)整播放進(jìn)度。我們平時(shí)使用音樂播放軟件一般都會(huì)有這個(gè)功能。seekTo方法接受一個(gè)毫秒?yún)?shù)。
int targetMS = (int) (percent * mediaPlayer.getDuration());mediaPlayer.seekTo(targetMS);
seekTo并不會(huì)改變MediaPlayer的狀態(tài)。
int targetMS = (int) (percent * mediaPlayer.getDuration());mediaPlayer.seekTo(targetMS);
reset后的mediaPlayer進(jìn)入Idle狀態(tài)。需要重新設(shè)置音源與準(zhǔn)備。
釋放 - release
不再使用這個(gè)mediaPlayer時(shí),應(yīng)當(dāng)盡快釋放掉,以釋放相關(guān)的資源。
調(diào)用release后,mediaPlayer進(jìn)入End狀態(tài)。此時(shí)這個(gè)mediaPlayer就不能再使用了。
常用監(jiān)聽器
緩沖監(jiān)聽器 OnBufferingUpdateListener
比如我們加載網(wǎng)絡(luò)音頻的時(shí)候,常用這個(gè)監(jiān)聽器來監(jiān)聽緩沖進(jìn)度。顯示緩沖進(jìn)度,也可以提高用戶體驗(yàn)。
mMediaPlayer.prepareAsync();mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // percent代表緩沖百分比 }});
錯(cuò)誤監(jiān)聽器 OnErrorListener
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { return true; // 返回true表示在此處理錯(cuò)誤,不會(huì)回調(diào)onCompletion }});
注意onError的返回值??梢赃x擇自己處理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類。使用后記得關(guān)閉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); }}
播放在線音頻
設(shè)置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播放音頻”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。