package org.kymjs.music.utils; import java.util.List; import org.kymjs.kjframe.ui.KJActivityStack; import org.kymjs.kjframe.ui.ViewInject; import org.kymjs.music.Config; import org.kymjs.music.bean.Music; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.net.Uri; /** * 播放器类 单例模式:封装了播放器的相关操作 * * @author kymjs * */ public class Player { private static Player player = new Player(); private MediaPlayer media; private int mode; private int playing = Config.PLAYING_STOP; private List<Music> list; private int position = 0; private Context context; private Player() { if (list == null || Config.changeMusicInfo) { list = ListData .getLocalList(KJActivityStack.create().topActivity()); } } public static Player getPlayer() { return player; } public List<Music> getList() { return this.list; } public int getListPosition() { return this.position; } public Music getMusic() { Music music = null; if (position >= list.size()) { music = new Music(); music.setArtist(Config.ARTIST); music.setTitle(Config.TITLE); } else { music = list.get(position); } return music; } public void setMode(int mode) { this.mode = mode; } public int getMode() { return this.mode; } public int getPlaying() { return playing; } // 获取播放的音乐文件总时间长度 public int getDuration() { int durat = 0; if (media != null) { durat = media.getDuration(); } return durat; } // 获取当前播放音乐时间点 public int getCurrentPosition() { int currentPosition = 0; if (media != null) { currentPosition = media.getCurrentPosition(); } return currentPosition; } // 将音乐播放跳转到某一时间点,以毫秒为单位 public void seekTo(int msec) { if (media != null) { media.seekTo(msec); } } public void destroy() { if (media != null) { media.release(); playing = Config.PLAYING_STOP; } } public void stop() { if (playing != Config.PLAYING_STOP) { media.reset(); playing = Config.PLAYING_STOP; context.sendBroadcast(new Intent(Config.RECEIVER_MUSIC_CHANGE)); } } public void pause() { if (playing != Config.PLAYING_PAUSE) { media.pause(); playing = Config.PLAYING_PAUSE; context.sendBroadcast(new Intent(Config.RECEIVER_MUSIC_CHANGE)); } } // 正在暂停,即将开始继续播放 public Music replay() { if (playing != Config.PLAYING_PLAY) { media.start(); playing = Config.PLAYING_PLAY; context.sendBroadcast(new Intent(Config.RECEIVER_MUSIC_CHANGE)); } return list.get(position); } public Music play(Context context, List<Music> list, int position) { // 如果有正在播放的歌曲,将它停止 if (playing == Config.PLAYING_PLAY) { media.reset(); } media = MediaPlayer.create(context, Uri.parse("file://" + list.get(position).getPath())); try { media.start(); this.list = list; this.position = position; this.context = context; media.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Player.this.context.sendBroadcast(new Intent( Config.RECEIVER_MUSIC_CHANGE)); completion(Player.this.context, Player.this.list, Player.this.position); } }); playing = Config.PLAYING_PLAY; context.sendBroadcast(new Intent(Config.RECEIVER_MUSIC_CHANGE)); } catch (NullPointerException e) { ViewInject.toast("亲,找不到歌曲了,存储卡拔掉了吗?"); } return list.get(position); } public Music next(Context context) { Music music = null; if (list.size() < 1) { this.destroy(); } else { media.reset(); // 停止上一首 position = (position + 1) % list.size(); play(context, list, position); music = list.get(position); } return music; } public Music previous(Context context) { Music music = null; if (list.size() < 1) { this.destroy(); music = null; } else { media.reset(); // 停止上一首 position = (position + list.size() - 1) % list.size(); play(context, list, position); music = list.get(position); } return music; } public Music completion(Context context, List<Music> list, int position) { Music music = null; switch (mode) { case Config.MODE_REPEAT_SINGLE: // 单曲播放 stop(); break; case Config.MODE_REPEAT_ALL: // 单曲循环 music = play(context, list, position); break; case Config.MODE_SEQUENCE: // 列表循环 music = play(context, list, (position + 1) % list.size()); break; case Config.MODE_RANDOM: // 随机循环 music = play(context, list, (int) (Math.random() * list.size())); break; default: break; } return music; } }