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)。可以直接start播放。
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("
播放網(wǎng)絡(luò)音頻時(shí),如果使用的是http,有可能會報(bào)錯(cuò) 可以簡單地設(shè)置一下manifest,設(shè)置 準(zhǔn)備 - prepare 同步和異步準(zhǔn)備音頻資源。 使用異步方式準(zhǔn)備音頻,經(jīng)常與 循環(huán)播放 - Looping 設(shè)置循環(huán)播放setLooping。 播放完畢后,不會回調(diào)OnCompletionListener,而是從頭播放當(dāng)前音頻。 播放 - start 播放音頻,調(diào)用start方法。 處于Prepared,Pause和PlaybackComplete狀態(tài)時(shí),可以調(diào)用start方法,進(jìn)入Started狀態(tài)。 暫停 - pause 暫停播放,使用pause方法。在暫停前先判斷一下mediaPlayer的是否在播放。 暫停成功則處于Paused狀態(tài)。 停止 - stop 回顧一下MediaPlayer狀態(tài)切換的圖示,我們可以得知在播放中,暫停,播放完成這3個(gè)狀態(tài)下,可以調(diào)用stop方法,進(jìn)入Stopped狀態(tài)。 調(diào)進(jìn)度 - seekTo 調(diào)整播放進(jìn)度。我們平時(shí)使用音樂播放軟件一般都會有這個(gè)功能。 seekTo并不會改變MediaPlayer的狀態(tài)。 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)。 錯(cuò)誤監(jiān)聽器 OnErrorListener 注意onError的返回值??梢赃x擇自己處理error。 播放完畢監(jiān)聽器 OnCompletionListener 使用示例 播放assets里的音頻 播放assets里的音頻文件,使用到AssetFileDescriptor類。使用后記得關(guān)閉AssetFileDescriptor。 播放本地音頻文件 嘗試播放音頻文件。僅播放一次。 播放在線音頻 設(shè)置url,播放在線音頻 代碼可以參考示例工程: https://github.com/RustFisher/android-MediaPlayer 總結(jié) 以上所述是小編給大家介紹的Android MediaPlayer 播放音頻的方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
java.io.IOException: Cleartext HTTP traffic to demo.com not permitted
usesCleartextTraffic=”true”
<application
android:usesCleartextTraffic="true">
prepareAsync()
是異步的方式,prepare是同步的。注意線程調(diào)度問題,同時(shí)不要阻塞UI線程。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)備好了就播放
}
});
mediaPlayer.setLooping(true);
mediaPlayer.start();
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
mediaPlayer.stop();
seekTo方法接受一個(gè)毫秒?yún)?shù)。
int targetMS = (int) (percent * mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);
int targetMS = (int) (percent * mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// percent代表緩沖百分比
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
return true; // 返回true表示在此處理錯(cuò)誤,不會回調(diào)onCompletion
}
});
* @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);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
// 播放完畢
}
});
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);
}
}
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);
}
}
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Android App中使用AudioManager類來編寫音頻播放器
這篇文章主要介紹了Android App中使用AudioManager類來編寫音樂播放器的方法,文中舉了一個(gè)簡單的例子實(shí)現(xiàn)了基礎(chǔ)的播放暫停和靜音等功能,需要的朋友可以參考下2016-04-04Android亮度調(diào)節(jié)的幾種實(shí)現(xiàn)方法
本篇文章詳細(xì)介紹了Android亮度調(diào)節(jié)的幾種實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)的改變
這篇文章主要為大家詳細(xì)介紹了Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)的改變,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05android之App Widget開發(fā)實(shí)例代碼解析
本篇文章主要介紹了App Widget框架的實(shí)例應(yīng)用,AppWidget就是我們平常在桌面上見到的那種一個(gè)個(gè)的小窗口,利用這個(gè)小窗口可以給用戶提供一些方便快捷的操作。有需要的可以了解一下。2016-11-11Android控件CardView實(shí)現(xiàn)卡片布局
這篇文章主要為大家詳細(xì)介紹了Android控件CardView實(shí)現(xiàn)卡片布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10Android實(shí)現(xiàn)實(shí)時(shí)通信示例
本篇文章主要介紹了Android實(shí)時(shí)通信示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03使用androidx BiometricPrompt實(shí)現(xiàn)指紋驗(yàn)證功能
這篇文章主要介紹了使用androidx BiometricPrompt實(shí)現(xiàn)指紋驗(yàn)證功能,對android指紋驗(yàn)證相關(guān)知識感興趣的朋友跟隨小編一起看看吧2021-07-07Android自定義view仿QQ的Tab按鈕動(dòng)畫效果(示例代碼)
這篇文章主要介紹了Android自定義view仿QQ的Tab按鈕動(dòng)畫效果(示例代碼),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考價(jià)值,需要的朋友可以參考下2021-01-01