为方便使用MediaPlayer播放音频,这里封装了一个类,使用的时候直接调用方法就可以了
public class MediaPlay {
private static MediaPlayer mMediaPlayer = null;
private static MediaPlayCallBack mMediaPlayerCallBack = null;
private static Timer timer;//定时器
private static int totalDuration;//音频总时长
private static int currentPosition;//当前播放的进度
private static DefectRecordingAdapter.RecordingHolder mHolder;
private MediaPlay() {
// 禁止被外部类实例化
}
//播放单个音频文件
public static void startMedia(Context context, MediaPlayCallBack soundPlayCallBack, DefectRecordingAdapter.RecordingHolder holder,String path) {
mMediaPlayerCallBack = soundPlayCallBack;
mHolder = holder;
stopMedia();
// mMediaPlayer = MediaPlayer.create(context, audioId);//加载raw里的音频文件
mMediaPlayer = MediaPlayer.create(context, Uri.parse(path));//加载音频连接
// try {
// mMediaPlayer.setDataSource(path);
// } catch (IOException e) {
// e.printStackTrace();
// }
mMediaPlayer.start();
totalDuration = mMediaPlayer.getDuration() / 1000;//获取音乐总时长
cancelTimer();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//更新播放进度
if (null != mMediaPlayer) {
currentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder, MediaPlayCallBack.STATE_START, totalDuration, currentPosition);
}
}
},0,50);
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
cancelTimer();
if (null != mp) {
mp.stop();
mp.release();
}
mMediaPlayer = null;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder,MediaPlayCallBack.STATE_STOP,totalDuration,0);
}
});
}
//音频是否正在播放
public static boolean isPlaying(){
if (mMediaPlayer == null){
return false;
}
return mMediaPlayer.isPlaying();
}
//暂停播放
public static void pauseMedia() {
cancelTimer();
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
currentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder,MediaPlayCallBack.STATE_PAUSE,totalDuration,currentPosition);
}
}
//继续播放
public static void continueMedia() {
if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
mMediaPlayer.start();
currentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder,MediaPlayCallBack.STATE_CONTINUE,totalDuration,currentPosition);
cancelTimer();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//更新播放进度
if (null != mMediaPlayer) {
currentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder, MediaPlayCallBack.STATE_CONTINUE, totalDuration, currentPosition);
}
}
},0,1000);
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
cancelTimer();
if (null != mp) {
mp.stop();
mp.release();
}
mMediaPlayer = null;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder,MediaPlayCallBack.STATE_STOP,totalDuration,0);
}
});
}
}
//停止播放
public static void stopMedia() {
cancelTimer();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer = null;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder,MediaPlayCallBack.STATE_STOP,totalDuration,0);
}
}
// 直接拖动音频播放进度
public static void seekToMedia(int progress,int playType){
mMediaPlayer.seekTo(progress);
currentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder, playType, totalDuration, currentPosition);
}
// 先加载音频文件 再执行拖动进度播放
public static void seekToMedia_load(Context context, MediaPlayCallBack soundPlayCallBack, DefectRecordingAdapter.RecordingHolder holder,String path,int progress){
mMediaPlayerCallBack = soundPlayCallBack;
mHolder = holder;
mMediaPlayer = MediaPlayer.create(context, Uri.parse(path));
totalDuration = mMediaPlayer.getDuration() / 1000;//获取音乐总时长
mMediaPlayer.seekTo(progress*1000);
mMediaPlayer.start();
currentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder, MediaPlayCallBack.STATE_START, totalDuration, currentPosition);
cancelTimer();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//更新播放进度
if (null != mMediaPlayer) {
currentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder, MediaPlayCallBack.STATE_START, totalDuration, currentPosition);
}
}
},0,50);
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
cancelTimer();
if (null != mp) {
mp.stop();
mp.release();
}
mMediaPlayer = null;
mMediaPlayerCallBack.mediaPlayCallBack(mHolder,MediaPlayCallBack.STATE_STOP,totalDuration,0);
}
});
}
private static void cancelTimer(){
if (null != timer){
timer.cancel();
timer.purge();
timer = null;
}
}
里面用到的播放回调接口
/**
* Created by WJY.
* Date: 2020/12/17
* Time: 18:43
* Description: 音频播放回调
*/
public interface MediaPlayCallBack {
public static final int STATE_START = 0; // 播放
public static final int STATE_PAUSE = 1;// 暂停
public static final int STATE_CONTINUE = 2;// 继续播放
public static final int STATE_STOP = 3;// 停止
/**
* @param type 播放模式
* @param totalDuration 音频总时长
* @param currentPosition 当前播放的进度
*/
public void mediaPlayCallBack(DefectRecordingAdapter.RecordingHolder holder, int type, int totalDuration, int currentPosition);
}