/* * Copyright (c) 2015 [1076559197@qq.com | tchen0707@gmail.com] * * Licensed under the Apache License, Version 2.0 (the "Licenseā€); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.bczm.widgetcollections.player; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnBufferingUpdateListener; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import com.bczm.widgetcollections.bean.MusicsListEntity; import com.bczm.widgetcollections.common.Constants; import com.bczm.widgetcollections.utils.LogUtils; import org.apache.commons.logging.Log; import java.util.ArrayList; import java.util.List; import java.util.Random; public class MusicPlayer implements OnCompletionListener, OnErrorListener, OnBufferingUpdateListener, OnPreparedListener { private final static String TAG = MusicPlayer.class.getSimpleName(); private final static long SLEEP_TIME = 1000; private MediaPlayer mMediaPlayer; private List<MusicsListEntity> mMusicList; private int mCurPlayIndex; private int mPlayState; private int mPLayMode; private Random mRandom; private Context mContext; public MusicPlayer(Context context) { initParameter(context); } private void initParameter(Context context) { mContext = context; mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnErrorListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnBufferingUpdateListener(this); mMusicList = new ArrayList<MusicsListEntity>(); mCurPlayIndex = -1; mPlayState = MusicPlayState.MPS_LIST_EMPTY; mPLayMode = MusicPlayMode.MPM_LIST_LOOP_PLAY; mRandom = new Random(); mRandom.setSeed(System.currentTimeMillis()); } public void exit() { mMediaPlayer.reset(); mMediaPlayer.release(); mMusicList.clear(); mCurPlayIndex = -1; mPlayState = MusicPlayState.MPS_LIST_EMPTY; } public void refreshMusicList(MusicsListEntity entity) { if (entity == null) { return; } mMusicList.clear(); mMusicList.add(entity); if (mMusicList.size() == 0) { mPlayState = MusicPlayState.MPS_LIST_EMPTY; mCurPlayIndex = -1; return; } mPlayState = MusicPlayState.MPS_LIST_FULL; } public int getMusicListCount() { return null == mMusicList || mMusicList.isEmpty() ? 0 : mMusicList.size(); } public int getPlayState() { return mPlayState; } public void play() { preparedMusic(0); } public void play(int position) { preparedMusic(position); } public void replay() { if (mPlayState == MusicPlayState.MPS_LIST_EMPTY) { return; } mMediaPlayer.start(); mPlayState = MusicPlayState.MPS_PLAYING; } public void pause() { if (mPlayState != MusicPlayState.MPS_PLAYING) { return; } mMediaPlayer.pause(); mPlayState = MusicPlayState.MPS_PAUSE; } public void stop() { if (mPlayState != MusicPlayState.MPS_PLAYING && mPlayState != MusicPlayState.MPS_PAUSE) { return; } mMediaPlayer.stop(); mPlayState = MusicPlayState.MPS_STOP; } public void playNext() { mCurPlayIndex++; mCurPlayIndex = reviceIndex(mCurPlayIndex); preparedMusic(mCurPlayIndex); } public void playPrev() { mCurPlayIndex--; mCurPlayIndex = reviceIndex(mCurPlayIndex); preparedMusic(mCurPlayIndex); } public void seekTo(int rate) { if (mPlayState == MusicPlayState.MPS_LIST_EMPTY) { return; } int r = reviceSeekValue(rate); int time = mMediaPlayer.getDuration(); int curTime = (int) ((float) r / 100 * time); mMediaPlayer.seekTo(curTime); } public int getCurPosition() { if (mPlayState == MusicPlayState.MPS_PLAYING || mPlayState == MusicPlayState.MPS_PAUSE) { LogUtils.e("MusicPlayer-------------------->> "+mMediaPlayer.getCurrentPosition()); return mMediaPlayer.getCurrentPosition(); } LogUtils.e("MusicPlayer-------------------->> "); return 0; } public int getDuration() { if (mPlayState == MusicPlayState.MPS_LIST_EMPTY) { return 0; } return mMediaPlayer.getDuration(); } public void setPlayMode(int mode) { switch (mode) { case MusicPlayMode.MPM_SINGLE_LOOP_PLAY: case MusicPlayMode.MPM_ORDER_PLAY: case MusicPlayMode.MPM_LIST_LOOP_PLAY: case MusicPlayMode.MPM_RANDOM_PLAY: mPLayMode = mode; break; } } public int getPlayMode() { return mPLayMode; } private int reviceIndex(int index) { if (index < 0) { index = mMusicList.size() - 1; } if (index >= mMusicList.size()) { index = 0; } return index; } private int reviceSeekValue(int value) { if (value < 0) { value = 0; } if (value > 100) { value = 100; } return value; } private int getRandomIndex() { int size = mMusicList.size(); if (size == 0) { return -1; } return Math.abs(mRandom.nextInt() % size); } private void preparedMusic(int index) { if (mPLayMode == MusicPlayState.MPS_LIST_EMPTY || index < 0 || index >= getMusicListCount()) { return; } mCurPlayIndex = index; mMediaPlayer.reset(); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); String dataSource = mMusicList.get(mCurPlayIndex).getUrl(); try { mMediaPlayer.setDataSource(dataSource); mMediaPlayer.prepareAsync(); mPlayState = MusicPlayState.MPS_PREPARED; } catch (Exception e) { e.printStackTrace(); } } @Override public void onCompletion(MediaPlayer mp) { LogUtils.e("mPLayMode = " + mPLayMode); // TLog.i(TAG, "mPLayMode = " + mPLayMode); switch (mPLayMode) { case MusicPlayMode.MPM_SINGLE_LOOP_PLAY: play(mCurPlayIndex); break; case MusicPlayMode.MPM_ORDER_PLAY: if (mCurPlayIndex != mMusicList.size() - 1) { playNext(); } else { stop(); } break; case MusicPlayMode.MPM_LIST_LOOP_PLAY: if (mCurPlayIndex != mMusicList.size() - 1) { playNext(); } else { play(); } break; case MusicPlayMode.MPM_RANDOM_PLAY: int index = getRandomIndex(); if (index != -1) { mCurPlayIndex = index; } else { mCurPlayIndex++; } mCurPlayIndex = reviceIndex(mCurPlayIndex); play(mCurPlayIndex); break; default: break; } } @Override public boolean onError(MediaPlayer mp, int what, int extra) { LogUtils.e("MusicPlayer onError!!!\n"); // TLog.e(TAG, "MusicPlayer onError!!!\n"); return false; } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { LogUtils.e("second percent --> " + percent); // TLog.d(TAG, "second percent --> " + percent); if (percent < 100) { Intent intent = new Intent(); intent.setAction(Constants.ACTION_MUSIC_SECOND_PROGRESS_BROADCAST); intent.putExtra(Constants.KEY_MUSIC_SECOND_PROGRESS, percent); mContext.sendBroadcast(intent); } } @Override public void onPrepared(MediaPlayer mp) { mMediaPlayer.start(); mPlayState = MusicPlayState.MPS_PLAYING; sendPlayBundle(); sendPlayCurrentPosition(); } private void sendPlayBundle() { Intent intent = new Intent(Constants.ACTION_MUSIC_BUNDLE_BROADCAST); Bundle extras = new Bundle(); LogUtils.e("sendPlayBundle-------------------------------->"+ getDuration()); extras.putInt(Constants.KEY_MUSIC_TOTAL_DURATION, getDuration()); extras.putParcelable(Constants.KEY_MUSIC_PARCELABLE_DATA, mMusicList.get(mCurPlayIndex)); intent.putExtras(extras); mContext.sendBroadcast(intent); } private void sendPlayCurrentPosition() { new Thread() { public void run() { Intent intent = new Intent(Constants.ACTION_MUSIC_CURRENT_PROGRESS_BROADCAST); while (mMediaPlayer.isPlaying()) { LogUtils.e("sendPlayCurrentPosition-------------------------------->"+ getCurPosition()); intent.putExtra(Constants.KEY_MUSIC_CURRENT_DUTATION, getCurPosition()); mContext.sendBroadcast(intent); try { sleep(SLEEP_TIME); } catch (Exception e) { e.printStackTrace(); } } } }.start(); } }