MediaPlayerHolder

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);

            }

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容