package com.voibook.voicebook.app.feature.aicall.media;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.text.TextUtils;
import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class MediaPlayerHolderimplements IMediaPlayer {
public int PLAYBACK_POSITION_REFRESH_INTERVAL_MS =1000;
private MediaPlayermMediaPlayer;
private StringplayUrl;
private ScheduledExecutorServicemExecutor;
private RunnablemSeekbarPositionUpdateTask;
private IMediaPlayerListenerlistener;
public void setMediaPlayerListener(IMediaPlayerListener listener) {
this.listener = listener;
}
private void init() {
if (mMediaPlayer ==null) {
mMediaPlayer =new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setScreenOnWhilePlaying(true);
//注册,播放完成后的监听
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopUpdatingCallbackWithPosition(true);
if (listener !=null) {
listener.onPlayerCompleted(playUrl);
}
}
});
//监听媒体流是否装载完成
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
onPreparedComplete();
}
});
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if (listener !=null) {
listener.onPlayerError(MediaPlayerHolder.this, what, extra);
}
return false;
}
});
}
}
@Override
public void load(String url) {
if (TextUtils.isEmpty(url)) {
if (listener !=null) {
listener.onPlayerCompleted("");
}
return;
}
this.playUrl = url;
init();
mMediaPlayer.reset();//防止再次添加进来出现崩溃信息
try {
mMediaPlayer.setDataSource(url);
}catch (IOException e) {
e.printStackTrace();
}
mMediaPlayer.prepareAsync();
}
@Override
public void release() {
stopUpdatingCallbackWithPosition(false);
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer =null;
listener =null;
}
@Override
public boolean isPlaying() {
if (mMediaPlayer !=null) {
return mMediaPlayer.isPlaying();
}
return false;
}
@Override
public void play() {
if (mMediaPlayer !=null && !mMediaPlayer.isPlaying()) {
mMediaPlayer.start();
startUpdatingCallbackWithPosition();
}
}
@Override
public void stop() {
if (mMediaPlayer !=null) {
mMediaPlayer.stop();
}
}
@Override
public void reset() {
if (mMediaPlayer !=null) {
release();
load(playUrl);
stopUpdatingCallbackWithPosition(true);
}
}
@Override
public void pause() {
if (mMediaPlayer !=null &&mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
}
@Override
public void onPreparedComplete() {
int duration =mMediaPlayer.getDuration();//获取总时长
if (listener !=null) {
listener.onPlayerStart(MediaPlayerHolder.this, duration, playUrl);
listener.onPlayerChanged(playUrl, 0);
}
}
@Override
public void seekTo(int position) {
if (mMediaPlayer !=null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mMediaPlayer.seekTo(position, MediaPlayer.SEEK_CLOSEST);
}else {
mMediaPlayer.seekTo(position);
}
}
}
/**
* 开启线程,获取当前播放的进度
*/
private void startUpdatingCallbackWithPosition() {
if (mExecutor ==null) {
mExecutor = Executors.newSingleThreadScheduledExecutor();
}
if (mSeekbarPositionUpdateTask ==null) {
mSeekbarPositionUpdateTask =new Runnable() {
@Override
public void run() {
updateProgressCallbackTask();
}
};
}
mExecutor.scheduleAtFixedRate(
mSeekbarPositionUpdateTask,
0,
PLAYBACK_POSITION_REFRESH_INTERVAL_MS,
TimeUnit.MILLISECONDS
);
}
/**
* 更新当前的进度
*/
private void updateProgressCallbackTask() {
if (mMediaPlayer !=null &&mMediaPlayer.isPlaying()) {
int currentPosition =mMediaPlayer.getCurrentPosition();
if (listener !=null) {
listener.onPlayerChanged(playUrl, currentPosition);
}
}
}
/**
* 播放完成监听
*/
private void stopUpdatingCallbackWithPosition(boolean reset) {
if (mExecutor !=null) {
mExecutor.shutdownNow();
mExecutor =null;
mSeekbarPositionUpdateTask =null;
if (reset &&listener !=null) {
listener.onPlayerChanged(playUrl, 0);
}
}
}
}