Media 设置play,pause,stop时,需要判断很多状态,并且要和Media的生命周期结合在一起。
下面是一个简单demo。
Media 应该放在service里操作,而不是放在activity里。因此此类扩展Service。
package com.wolfee963.service;
import java.io.File;
import com.wolfee963.models.Mp3Info;
import com.wolfee963.utils.AppConstants;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
public class PlayerService extends Service {
//use boolean to present status of media
private boolean isPlaying = false;
private boolean isPaused = false;
private boolean isReleased = false;
private MediaPlayer mediaPlayer;
// private Mp3Info mp3Info;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println(1);
int MSG = (int)intent.getIntExtra("msg",0);
Mp3Info mp3Info = (Mp3Info)intent.getSerializableExtra("mp3Info");
if(MSG == AppConstants.PlayerMsg.PLAY_MSG){
play(mp3Info);
}else if(MSG == AppConstants.PlayerMsg.PUASE_MSG){
pause();
}else if(MSG == AppConstants.PlayerMsg.STOP_MSG){
stop();
}
return super.onStartCommand(intent, flags, startId);
}
//when play() is called,simply check isPlaying
private void play(Mp3Info mp3Info){
//judge if the media is playing
if(!isPlaying){
//bind a file to this media object
mediaPlayer = MediaPlayer.create(this, Uri.parse("file://"+ getMp3Uri(mp3Info)));
mediaPlayer.setLooping(false);
mediaPlayer.start();
//set the status boolean
isPlaying = true;
isPaused = false;
isReleased = false;
}
}
//when pause() is called,check Media firstly,then check isPlaying and isReleased
private void pause(){
//judge if the object is null
if(mediaPlayer != null){
if(isPlaying && !isReleased){
mediaPlayer.pause();
isPlaying = false;
isPaused = true;
isReleased = false;
}else if(!isPlaying && !isReleased){
mediaPlayer.start();
isPlaying = true;
isPaused = false;
isReleased = false;
}
}
}
//when stop() is called,check Midia and isReleased
private void stop(){
if(mediaPlayer != null && !isReleased){
mediaPlayer.stop();
mediaPlayer.release();
isPlaying = false;
isPaused = true;
isReleased = true;
}
}
private String getMp3Uri(Mp3Info mp3Info){
String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
String mp3Uri = sdPath + File.separator + "mp3" + File.separator + mp3Info.getMp3Name();
return mp3Uri;
}
}
图为正在播放
多次乱按三个按钮,没有发现问题。
不过感觉上应该还有BUG,最起码暂停按钮和播放按钮应该在一起的,哈啊哈。。。