使用MediaPlayer在Service中後臺播放網絡音樂

註釋都在裏面,大家可以看一下,裏面使用了Messenger作爲Service與Activity的通信

package com.ligongmusic.service;

import java.io.IOException;

import com.ligongmusic.R;
import com.ligongmusic.activity.MusicActivity;
import com.ligongmusic.util.LoggerUtils;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
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.OnPreparedListener;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.os.SystemClock;
import android.view.View;
import android.widget.RemoteViews;

public class MusicOnlineService extends Service implements OnBufferingUpdateListener, OnPreparedListener, OnCompletionListener{
	private Context mContext;
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onPrepared(MediaPlayer mp) {
		// 播放
		mp.start();
		MusicThread thread = new MusicThread();
		thread.start();
	}
	
	@Override
	public void onCompletion(MediaPlayer mp) {
		// 播放完成
		if(isLoop)//如果設置單曲循環,則跳過方法
			return;
		// 獲取下一首 
		try {
			Message msg = new Message();
			msg.what = PLAYER_NEXT;
			mMessenger.send(msg);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void onBufferingUpdate(MediaPlayer mp, int percent) {
		// TODO Auto-generated method stub
		
	}
	private boolean isPrepare = false;
	private MediaPlayer mPlayer;
    public static final int START_MUSIC = 0;
    public static final int PAUSE_MUSIC = 1;
    public static final int CONTINUE_MUSIC = 2;
    public static final int STOP_MUSIC = 3;
    public static final int SEEK_TO_PROGRESS = 4;
    public static final int DURATION_TYPE = 5;
    public static final int CURRENT_TIME_TYPE = 6;
    public static final int PLAYER_NEXT = 7;
    public static final int SEEK_RESUME = 8;
    public static final int CHANGE_SEEK = 9;
    private boolean isLoop = false;
    private String playIng = "";// 正在播放
    private Messenger mMessenger;
	
	public int onStartCommand(Intent intent, int flags, int startId) {
		if(intent == null)
			return super.onStartCommand(intent, flags, startId);
		int status = intent.getIntExtra("status", -1);
		// 改變播放設置
		int playerSetting = intent.getIntExtra("playerSetting", -1);
		if(playerSetting == 0){
			//表示設置循環播放 
			isLoop = true;
			mPlayer.setLooping(isLoop);
		} else {
			// 設置非循環播放 
			isLoop = false;
			mPlayer.setLooping(isLoop);
		}
		switch (status) {
		case START_MUSIC:
			// 播放音樂
			playNewMusic(intent);
			break;
		case PAUSE_MUSIC:
			// 暫停
			pauseMusic(intent);
			break;
		case CONTINUE_MUSIC:
			// 繼續
			restartMusic(intent);
			break;
		case STOP_MUSIC:
			// 停止
			stopMusic(intent);
			break;
		case SEEK_TO_PROGRESS:
			// 移動進度條
			playMusicByProgress(intent);
			break;
		default:
			// 第一次創建時,獲取到Activity中的Messenger對象
	     	mMessenger = (Messenger) intent.getExtras().get("messenger");
	     	break;
		}
        return super.onStartCommand(intent, flags, startId);
    }
	
	@Override
	public void onCreate() {
		super.onCreate();
		// 獲取上下文
		mContext = getApplicationContext();
		// 此方法只被調用一次,初始化MediaPlayer
		mPlayer = new MediaPlayer();  
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 設置媒體流類型  
        mPlayer.setOnBufferingUpdateListener(this);  
        mPlayer.setOnPreparedListener(this);  
        mPlayer.setOnCompletionListener(this);
	}
	
	 
	private void playNewMusic(Intent intent){
		String musicPath = intent.getStringExtra("musicName");
		if(mPlayer == null)
			mPlayer = new MediaPlayer();
		mPlayer.reset();
		try{
			mPlayer.setDataSource(musicPath);
			mPlayer.prepare();
			isPrepare = true;
		}catch (IOException e) {
			e.printStackTrace();
		}
    }
    
    private void pauseMusic(Intent intent){
    	if(mPlayer == null)
    		playNewMusic(intent);
    	else{
    		mPlayer.pause();
    		// 進度條時間
			MusicThread thread = new MusicThread();
			thread.start();
    	}
    }
    
    private void stopMusic(Intent intent){
    	mPlayer.stop();
    	mPlayer.release();
    	mPlayer = null;
    }
    
    private void restartMusic(Intent intent){
    	if(mPlayer == null || !isPrepare)
    		playNewMusic(intent);
    	else{
    		mPlayer.start();
    		// 進度條時間
			MusicThread thread = new MusicThread();
			thread.start();
    	}
    }
    
    private void playMusicByProgress(Intent intent){
    	if(mPlayer == null || !isPrepare){// 如果沒有選擇播放的音樂,通知activity改變界面
			try {
				Message msg = new Message();
				msg.what = SEEK_RESUME;
//				msg.obj = mPlayer.getCurrentPosition();// 發送當前時長
				mMessenger.send(msg);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
			LoggerUtils.getLog(MusicOnlineService.class).error(isPrepare + "");
    		return;
    	}
    	LoggerUtils.getLog(MusicOnlineService.class).error(isPrepare + "");
;
    	if(mPlayer.isPlaying()){
<span style="white-space:pre">		</span>//將播放位置移動到進度所在位置
    		mPlayer.seekTo(intent.getIntExtra("seek_time", mPlayer.getCurrentPosition()));
    		MusicThread thread = new MusicThread();
			thread.start();
    	}else{
			try {
				Message msg = new Message();
				msg.what = CHANGE_SEEK;
				msg.arg1 = intent.getIntExtra("seek_time", mPlayer.getCurrentPosition());// 發送當前時長
//				msg.arg2 = mPlayer.getDuration();// 發送總時長
//				msg.obj = mPlayer.isPlaying();
				mMessenger.send(msg);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    }
    
    class MusicThread extends Thread{
    	@Override
    	public void run() {
    		while(mPlayer.isPlaying()){
    			try {
    				Message msg = new Message();
    				msg.what = CURRENT_TIME_TYPE;
    				msg.arg1 = mPlayer.getCurrentPosition();// 發送當前時長
    				msg.arg2 = mPlayer.getDuration();// 發送總時長
    				msg.obj = mPlayer.isPlaying();// 播放狀態
					mMessenger.send(msg);
					SystemClock.sleep(1000);// 一秒發送一次Handler
				} catch (RemoteException e) {
					e.printStackTrace();
				}
    		}
    	}
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章