package com.konka.music.player; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.PowerManager; import com.konka.music.pojo.MusicInfo; public abstract class AbstractMediaPlayEngine implements IBasePlayEngine, OnCompletionListener, OnPreparedListener, OnErrorListener { // private static final CommonLog log = LogFactory.createLog(); protected MediaPlayer mMediaPlayer; protected MusicInfo mMusicInfo; protected Context mContext; protected int mPlayState; protected PlayerEngineListener mPlayerEngineListener; protected abstract boolean prepareSelf(); protected abstract boolean prepareComplete(MediaPlayer mp); public void setLooping(boolean looping) { mMediaPlayer.setLooping(looping); } protected void defaultParam() { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnErrorListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // mMediaPlayer.set // mMediaPlayer.setOnBufferingUpdateListener(this); mMusicInfo = null; mPlayState = PlayState.MPS_NOFILE; } public void setWakeMode(Context context) { // 确保我们的MediaPlayer在播放时获取了一个唤醒锁, // 如果不这样做,当歌曲播放很久时,CPU进入休眠从而导致播放停止 // 要使用唤醒锁,要确保在AndroidManifest.xml中声明了android.permission.WAKE_LOCK权限 mMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); } public AbstractMediaPlayEngine() { defaultParam(); } public void setPlayerListener(PlayerEngineListener listener) { mPlayerEngineListener = listener; } @Override public void play() { switch (mPlayState) { case PlayState.MPS_PAUSE: mMediaPlayer.start(); mPlayState = PlayState.MPS_PLAYING; performPlayListener(mPlayState); break; case PlayState.MPS_STOP: prepareSelf(); break; default: break; } } @Override public void pause() { switch (mPlayState) { case PlayState.MPS_PLAYING: mMediaPlayer.pause(); mPlayState = PlayState.MPS_PAUSE; performPlayListener(mPlayState); break; default: break; } } @Override public void stop() { if (mPlayState != PlayState.MPS_NOFILE) { mMediaPlayer.reset(); mMusicInfo = null; mPlayState = PlayState.MPS_STOP; performPlayListener(mPlayState); } } @Override public void skipTo(int time) { switch (mPlayState) { case PlayState.MPS_PLAYING: case PlayState.MPS_PAUSE: int time2 = reviceSeekValue(time); mMediaPlayer.seekTo(time2); break; default: break; } } public void exit() { stop(); mMediaPlayer.release(); mMusicInfo = null; mPlayState = PlayState.MPS_NOFILE; } @Override public void onPrepared(MediaPlayer mp) { prepareComplete(mp); } // 播放完毕 @Override public void onCompletion(MediaPlayer mp) { // log.e("onCompletion..."); if (mPlayerEngineListener != null) { mPlayerEngineListener.onTrackPlayComplete(mMusicInfo); } } public boolean isPlaying() { return mPlayState == PlayState.MPS_PLAYING; } public boolean isPause() { return mPlayState == PlayState.MPS_PAUSE; } public void playMedia(MusicInfo mediaInfo) { if (mediaInfo != null) { mMusicInfo = mediaInfo; if (mPlayerEngineListener != null) { mPlayerEngineListener.onTrackIntroductionData(mediaInfo); } prepareSelf(); } } public int getCurPosition() { if (mPlayState == PlayState.MPS_PLAYING || mPlayState == PlayState.MPS_PAUSE) { return mMediaPlayer.getCurrentPosition(); } return 0; } public int getDuration() { switch (mPlayState) { case PlayState.MPS_PLAYING: case PlayState.MPS_PAUSE: case PlayState.MPS_PARECOMPLETE: return mMediaPlayer.getDuration(); } return 0; } public int getPlayState() { return mPlayState; } public MusicInfo getMusicInfo() { return mMusicInfo; } protected void performPlayListener(int playState) { if (mPlayerEngineListener != null) { switch (playState) { case PlayState.MPS_INVALID: mPlayerEngineListener.onTrackStreamError(mMusicInfo); break; case PlayState.MPS_STOP: mPlayerEngineListener.onTrackStop(mMusicInfo); break; case PlayState.MPS_PLAYING: mPlayerEngineListener.onTrackPlay(mMusicInfo); break; case PlayState.MPS_PAUSE: mPlayerEngineListener.onTrackPause(mMusicInfo); break; case PlayState.MPS_PARESYNC: mPlayerEngineListener.onTrackPrepareSync(mMusicInfo); break; } } } private int reviceSeekValue(int value) { if (value < 0) { value = 0; } if (value > mMediaPlayer.getDuration()) { value = mMediaPlayer.getDuration(); } return value; } @Override public boolean onError(MediaPlayer mp, int what, int extra) { // log.e("onError --> what = " + what); mPlayState = PlayState.MPS_INVALID; performPlayListener(mPlayState); return false; } }