項目需要做一個語音的IM功能雪情,語音播放使用MediaPlayer實現(xiàn),當快速點擊語音你辣,一個音頻播放沒有結(jié)束巡通,來回播放時,會重現(xiàn)重復播放的問題舍哄,下面說明如何解決宴凉。
private MediaPlayer mMediaPlayer;
private File mLastFile = null;
//播放音頻統(tǒng)一方法
private void doPlay(File mAudioFile) {
//配置播放器 MediaPlayer
LogUtil.d("ChatWebViewActivity", "in doPlay");
if (null != mMediaPlayer) {
if (mMediaPlayer.isPlaying()) {
if (!mLastFile.getName().equals(mAudioFile.getName())) {
//不為同一文件,暫停上個播放的文件后表悬,播放下個音頻文件
stopPlay();
} else {
//為同一文件弥锄,重復點擊,則直接暫停
stopPlay();
return;
}
}
}
LogUtil.d("ChatWebViewActivity", "in doPlay notFirst");
mLastFile = mAudioFile;
mMediaPlayer = new MediaPlayer();
try {
//設(shè)置聲音文件
FileInputStream fis = new FileInputStream(mAudioFile);
FileDescriptor fileD = fis.getFD();
mMediaPlayer.setDataSource(fileD);
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
}
});
//設(shè)置監(jiān)聽回調(diào)
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
voiceStatusChange(false, voiceId);
stopPlay();
}
});
//設(shè)置出錯的監(jiān)聽器
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
//提示用戶
stopPlay();
//釋放播放器
return true;
}
});
//配置音量蟆沫,是否循環(huán)
mMediaPlayer.setVolume(1, 1);
mMediaPlayer.setLooping(false);
mMediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
stopPlay();
}
}
public void stopPlay() {
if (mMediaPlayer != null) {
try {
mMediaPlayer.stop();
} catch (Exception e) {
e.printStackTrace();
mMediaPlayer = null;
mMediaPlayer = new MediaPlayer();
mMediaPlayer.stop();
}
mMediaPlayer.release();
mMediaPlayer = null;
}
}
解決方式為記錄上次播放的音頻文件籽暇,每次播放時,判斷是否為同一文件饭庞,是同一音頻文件戒悠,則直接暫停,若為不同的音頻文件舟山,則需要先暫停上次播放的音頻文件绸狐,在播放新的音頻文件。