PlayerServicejava
package com.anhui.music_player.util; import java.util.List; import com.anhui.music_player.model.Music; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Handler; import android.os.IBinder; import android.util.Log; public class PlayerService extends Service { private MediaPlayer mediaPlayer; // 媒體播放器對象 private String path; // 音樂文件路徑 private boolean isPause; // 暫停狀態 private int current = 0; // 記錄當前正在播放的音樂 private List<Music> mp3Infos; //存放Mp3Info對象的集合 private int status = 3; //播放狀態,默認爲順序播放 private MyReceiver myReceiver; //自定義廣播接收器 private int currentTime; //當前播放進度 private int duration; //播放長度 //服務要發送的一些Action public static final String UPDATE_ACTION = "com.wwj.action.UPDATE_ACTION"; //更新動做 public static final String CTL_ACTION = "com.wwj.action.CTL_ACTION"; //控制動做 public static final String MUSIC_CURRENT = "com.wwj.action.MUSIC_CURRENT"; //當前音樂播放時間更新動做 public static final String MUSIC_DURATION = "com.wwj.action.MUSIC_DURATION";//新音樂長度更新動做 /** * handler用來接收消息,來發送廣播更新播放時間 */ private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == 1) { if(mediaPlayer != null) { currentTime = mediaPlayer.getCurrentPosition(); // 獲取當前音樂播放的位置 Intent intent = new Intent(); intent.setAction(MUSIC_CURRENT); intent.putExtra("currentTime", currentTime); sendBroadcast(intent); // 給PlayerActivity發送廣播 handler.sendEmptyMessageDelayed(1, 1000); } } }; }; @Override public void onCreate() { super.onCreate(); Log.d("service", "service created"); mediaPlayer = new MediaPlayer(); mp3Infos =MusicList.getMusicData(this); /** * 設置音樂播放完成時的監聽器 */ mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp1) { if (status == 1) { // 單曲循環 mediaPlayer.start(); } else if (status == 2) { // 所有循環 current++; if(current > mp3Infos.size() - 1) { //變爲第一首的位置繼續播放 current = 0; } } else if (status == 3) { // 順序播放 current++; //下一首位置 if (current <= mp3Infos.size() - 1) { Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 發送廣播,將被Activity組件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); path = mp3Infos.get(current).getUrl(); play(0); }else { mediaPlayer.seekTo(0); current = 0; Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 發送廣播,將被Activity組件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); } } else if(status == 4) { //隨機播放 current = getRandomIndex(mp3Infos.size() - 1); System.out.println("currentIndex ->" + current); Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 發送廣播,將被Activity組件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); path = mp3Infos.get(current).getUrl(); play(0); } } }); myReceiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); registerReceiver(myReceiver, filter); } /** * 獲取隨機位置 * @param end * @return */ protected int getRandomIndex(int end) { int index = (int) (Math.random() * end); return index; } @Override public IBinder onBind(Intent arg0) { return null; } /** * 播放音樂 * * @param position */ private void play(int currentTime) { try { mediaPlayer.reset();// 把各項參數恢復到初始狀態 mediaPlayer.setDataSource(path); mediaPlayer.prepare(); // 進行緩衝 mediaPlayer.setOnPreparedListener(new PreparedListener(currentTime));// 註冊一個監聽器 handler.sendEmptyMessage(1); } catch (Exception e) { e.printStackTrace(); } } /** * 暫停音樂 */ private void pause() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); isPause = true; } } private void resume() { if (isPause) { mediaPlayer.start(); isPause = false; } } /** * 上一首 */ private void previous() { Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 發送廣播,將被Activity組件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); play(0); } /** * 下一首 */ private void next() { Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 發送廣播,將被Activity組件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); play(0); } /** * 中止音樂 */ private void stop() { if (mediaPlayer != null) { mediaPlayer.stop(); try { mediaPlayer.prepare(); // 在調用stop後若是須要再次經過start進行播放,須要以前調用prepare函數 } catch (Exception e) { e.printStackTrace(); } } } @Override public void onDestroy() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } } /** * * 實現一個OnPrepareLister接口,當音樂準備好的時候開始播放 * */ private final class PreparedListener implements OnPreparedListener { private int currentTime; public PreparedListener(int currentTime) { this.currentTime = currentTime; } @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); // 開始播放 if (currentTime > 0) { // 若是音樂不是從頭播放 mediaPlayer.seekTo(currentTime); } Intent intent = new Intent(); intent.setAction(MUSIC_DURATION); duration = mediaPlayer.getDuration(); intent.putExtra("duration", duration); //經過Intent來傳遞歌曲的總長度 sendBroadcast(intent); } } public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int control = intent.getIntExtra("control", -1); switch (control) { case 1: status = 1; // 將播放狀態置爲1表示:單曲循環 break; case 2: status = 2; //將播放狀態置爲2表示:所有循環 break; case 3: status = 3; //將播放狀態置爲3表示:順序播放 break; case 4: status = 4; //將播放狀態置爲4表示:隨機播放 break; } } } }
MusicList 獲取全部歌曲android
package com.anhui.music_player.util; public class MusicList { public static List<Music> getMusicData(Context context) { List<Music> musicList = new ArrayList<Music>(); ContentResolver cr = context.getContentResolver(); if (cr != null) { // 獲取全部歌曲 Cursor cursor = cr.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); if (null == cursor) { return null; } if (cursor.moveToFirst()) { do { Music m = new Music(); String title = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.TITLE)); String singer = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.ARTIST)); if ("<unknown>".equals(singer)) { singer = "未知藝術家"; } String album = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.ALBUM)); long size = cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.SIZE)); long time = cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.DURATION)); String url = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.DATA)); String name = cursor .getString(cursor .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); String sbr = name.substring(name.length() - 3, name.length()); if (sbr.equals("mp3")) { m.setTitle(title); m.setSinger(singer); m.setAlbum(album); m.setSize(size); m.setTime(time); m.setUrl(url); m.setName(name); musicList.add(m); } } while (cursor.moveToNext()); } if (cursor != null) { cursor.close(); } } return musicList; } }