package me.zhengken.zkmusicplayer;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.io.IOException;
import me.zhengken.zkmusicplayer.eventbus.MediaPlayerCreatedEvent;
import me.zhengken.zkmusicplayer.eventbus.MusicControlEvent;
import me.zhengken.zkmusicplayer.eventbus.PlayServiceCreatedEvent;
import me.zhengken.zkmusicplayer.eventbus.UpdateUiEvent;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Created by zhengken.me on 2016/11/27. ClassName : MusicPlayService Description :
*/
public class MusicPlayService extends Service implements MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener {
private static final String TAG = MusicPlayService.class.getSimpleName();
public static final int MUSIC_CONTROL_PLAY = 0;
public static final int MUSIC_CONTROL_PAUSE = 1;
private MediaPlayer mMediaPlayer;
private State mCurrentState;
private String mSongPath;
@Override
public void onCreate() {
super.onCreate();
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnBufferingUpdateListener(this);
EventBus.getDefault().register(this);
EventBus.getDefault().post(new MediaPlayerCreatedEvent(mMediaPlayer));
EventBus.getDefault().post(new PlayServiceCreatedEvent());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void initMediaPlayer() {
checkNotNull(mSongPath);
try {
mMediaPlayer.reset();
setCurrentState(State.STATE_IDLE);
mMediaPlayer.setDataSource(mSongPath);
setCurrentState(State.START_INITIALIZED);
mMediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
setCurrentState(State.STATE_PREPARED);
play();
}
@Subscribe
public void onMusicControlEvent(MusicControlEvent event) {
Log.d(TAG, "onMusicControlEvent()");
switch (event.mCtrlId) {
case MUSIC_CONTROL_PLAY:
// resume music
if (mSongPath != null && mSongPath.equals(event.mSongPath)) {
play();
return;
}
mSongPath = checkNotNull(event.mSongPath);
initMediaPlayer();
break;
case MUSIC_CONTROL_PAUSE:
pause();
break;
}
}
@Override
public void onCompletion(MediaPlayer mp) {
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.d(TAG, mp.getCurrentPosition() + "");
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
@Override
public void onDestroy() {
mMediaPlayer.reset();
mMediaPlayer.release();
super.onDestroy();
EventBus.getDefault().unregister(this);
}
private void play() {
if (mMediaPlayer != null && (mCurrentState == State.STATE_PAUSE || mCurrentState == State.STATE_PREPARED || mCurrentState == State.STATE_PLAYING || mCurrentState == State.STATE_COMPLETE)) {
mMediaPlayer.start();
setCurrentState(State.STATE_PLAYING);
EventBus.getDefault().post(new UpdateUiEvent());
}
}
private void pause() {
if (mMediaPlayer != null && (mCurrentState == State.STATE_PLAYING || mCurrentState == State.STATE_PAUSE || mCurrentState == State.STATE_COMPLETE)) {
mMediaPlayer.pause();
setCurrentState(State.STATE_PAUSE);
}
}
private void setCurrentState(State currentState) {
mCurrentState = currentState;
}
private enum State {
STATE_STOPPED, STATE_PREPARED, STATE_PLAYING, STATE_PAUSE, STATE_IDLE, STATE_END, STATE_ERROR, STATE_COMPLETE, START_INITIALIZED
}
}