package com.example.ipcplayer.service; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.PowerManager; import com.example.ipcplayer.utils.LogUtil; import com.example.ipcplayer.utils.StringUtil; public class LocalPlayer{ private final static String TAG = LocalPlayer.class.getSimpleName(); private int mPlayState = 0; private static final int STATE_PLAY = 1; private static final int STATE_STOP = 3; private static final int STATE_PAUSE = 2; private static final int STATE_IDLE = 0; private static final int STATE_ERROR = -1; private boolean mIsInitialized = false ; private OnCompletionListener mOnCompletionListener; private OnErrorListener mOnErrorListener; private OnPreparedListener mOnPreparedListener; private OnSeekCompleteListener mOnSeekCompleteListener; private Context mContext; private String mPath ; private MediaPlayer mMediaPlayer = new MediaPlayer(); public LocalPlayer(Context context){ mContext = context; mMediaPlayer.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK); } public boolean isPlaying(){ return mPlayState == STATE_PLAY; } public boolean isStop(){ return mPlayState == STATE_STOP; } public boolean isPause(){ return mPlayState == STATE_PAUSE; } public boolean isError(){ return mPlayState == STATE_ERROR; } public boolean isIdle(){ return mPlayState == STATE_IDLE; } public boolean isInitialized(){ return mIsInitialized; } public void setPlayState(int state){ LogUtil.d(TAG + " setPlayState state: " + state); mPlayState = state; } public interface OnCompletionListener { public void onCompletion(); } public interface OnErrorListener { public void onError(); } public interface OnPreparedListener{ public void onPrepared(); } public interface OnSeekCompleteListener{ public void onSeekComplete(); } public void setOnSeekCompleteListener(OnSeekCompleteListener listener){ mOnSeekCompleteListener = listener; } public void setOnErrorListener(OnErrorListener listener){ mOnErrorListener = listener; } public void setOnPreparedListener(OnPreparedListener listener){ mOnPreparedListener = listener; } public void setOnCompletionListener(OnCompletionListener listener){ mOnCompletionListener =listener; } MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mOnCompletionListener.onCompletion(); } }; MediaPlayer.OnErrorListener mErrorListener = new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { mOnErrorListener.onError(); return false; } }; MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mOnPreparedListener.onPrepared(); } }; MediaPlayer.OnSeekCompleteListener mSeekListener = new MediaPlayer.OnSeekCompleteListener() { @Override public void onSeekComplete(MediaPlayer mp) { mOnSeekCompleteListener.onSeekComplete(); } }; public void setDataSource(int source){ try { mMediaPlayer = MediaPlayer.create(mContext, source); mMediaPlayer.setOnPreparedListener(null); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // mMediaPlayer.prepare(); } catch (IllegalStateException e) { mIsInitialized = false ; e.printStackTrace(); } catch (Exception e) { mIsInitialized = false ; e.printStackTrace(); } mMediaPlayer.setOnCompletionListener(mCompletionListener); mMediaPlayer.setOnErrorListener(mErrorListener); mIsInitialized = true; setPlayState(STATE_IDLE); } public void setDataSource(String path) { LogUtil.d(TAG + " setDataSource path: " + path); mPath = path; if (StringUtil.isEmpty(mPath)) { return; } try { mMediaPlayer.reset(); if(mMediaPlayer == null){ LogUtil.d(TAG + " setDataSource mMediaPlayer is null"); return ; } mMediaPlayer.setOnPreparedListener(null); if (mPath.startsWith("content:\\")){ mMediaPlayer.setDataSource(mContext, Uri.parse(mPath)); }else { mMediaPlayer.setDataSource(mPath); // File file = new File(mPath); // FileInputStream fis = new FileInputStream(file); // mMediaPlayer.setDataSource(fis.getFD()); } mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.prepare(); } catch (IllegalArgumentException e) { mIsInitialized = false ; e.printStackTrace(); return ; } catch (SecurityException e) { mIsInitialized = false ; e.printStackTrace(); return ; } catch (IllegalStateException e) { mIsInitialized = false ; e.printStackTrace(); return ; } catch (IOException e) { mIsInitialized = false ; e.printStackTrace(); return ; } mMediaPlayer.setOnCompletionListener(mCompletionListener); mMediaPlayer.setOnErrorListener(mErrorListener); mIsInitialized = true; setPlayState(STATE_IDLE); } public void pause() { mMediaPlayer.pause(); setPlayState(STATE_PAUSE); } public void resume(){ if(!isPause()){ return ; } try { start(); } catch (Exception e) { LogUtil.d(TAG + " resume exception e:"); e.printStackTrace(); setPlayState(STATE_PAUSE); } } public void start(){ if (isInitialized()) { mMediaPlayer.start(); } else { LogUtil.d(TAG + " mediaplayer init error "); setPlayState(STATE_ERROR); return ; } setPlayState(STATE_PLAY); } public void stop(){ mMediaPlayer.reset(); // mMediaPlayer.release(); mIsInitialized = false ; setPlayState(STATE_STOP); } public long getCurrentPosition(){ return mMediaPlayer.getCurrentPosition(); } public long seek(long position){ mMediaPlayer.seekTo((int) position); start(); return position; } public void setVolume(float vol){ mMediaPlayer.setVolume(vol, vol); } public long getDuration(){ return mMediaPlayer.getDuration(); } public void release(){ stop(); mMediaPlayer.release(); } }