android的service问题自己学着晚上的视频写了一个mp3播放器,可是遇到一个很郁闷的问题,就是用service控制
android的service问题
自己学着晚上的视频写了一个mp3播放器,可是遇到一个很郁闷的问题,就是用service控制播放好暂停之后,把mediaplayer的设置放在onStartCommand里面的话,每次都新建一个,这样的话导致暂停不了,专门放在自己写的play(...)方法里面的话却又是不行,我想应该是不是第一个mediaplayer,不能控制MP3了.
相关代码:
- Java code
public class PlayService extends Service { private MediaPlayer mediaPlayer = null; private static boolean isPlaying = false; // 是否播放 private static boolean isPaused = false; // 是否暂停 private static boolean isStoped = false; // 是否停止 private static boolean isReleased = false; // 是否释放了 public PlayService() { System.out.println("PlayService"); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { System.out.println("onCreate"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("onStartCommand"); File f = (File) intent.getSerializableExtra("file"); int message = intent.getIntExtra("message", 3); // 播放控制信息 mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + [f.getAbsolutePath()));//---------------------看这里 play_pause_stop(message,f);//---------------------看这里 return super.onStartCommand(intent, flags, startId); } /** * 控制播放和暂停相关操作 * @param message * @param f */ private void play_pause_stop(int message,File f) { switch (message) { case R.id.play: play(mediaPlayer, f); break; case R.id.pause: pause(mediaPlayer); break; case R.id.stop: stop(mediaPlayer); break; default: //默认是播放 play(mediaPlayer, f); break; } } /** * 播放 * * @param mediaPlayer * @param f */ private void play(MediaPlayer mediaPlayer, File f) { if (!isPlaying) { try { /*mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + f.getAbsolutePath()));*/ //mediaPlayer.reset(); //mediaPlayer.prepare(); mediaPlayer.start();//---------------------看这里 System.out.println("play" + mediaPlayer); isPlaying = true; isReleased = false; isPaused = false; isStoped = false; } catch (Exception e) { e.printStackTrace(); } } } /** * 暂停 * * @param mediaPlayer */ private void pause(MediaPlayer mediaPlayer) { if (!isPaused && !isReleased) { System.out.println("pause" + mediaPlayer); mediaPlayer.pause();//---------------------看这里 isPaused = true; isPlaying = false; isReleased = true; } else if(!mediaPlayer.isPlaying()){ mediaPlayer.start(); isPlaying = true; isReleased = false; isPaused = false; } } /** * 停止 * * @param mediaPlayer */ private void stop(MediaPlayer mediaPlayer) { if (!isStoped) { mediaPlayer.stop(); mediaPlayer.release(); isStoped = true; isPlaying = false; isReleased = true; } }}- Java code
public class PlaySongActicity extends Activity { private Button play = null; private Button pause = null; private Button stop = null; private boolean isPlaying = false; // 是否播放 private boolean isPaused = false; // 是否暂停 private boolean isStoped = false; // 是否停止 private boolean isReleased = false; // 是否释放了 private MediaPlayer mediaPlayer = new MediaPlayer(); // 媒体播放器类 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.play); play = (Button) findViewById(R.id.play); pause = (Button) findViewById(R.id.pause); stop = (Button) findViewById(R.id.stop); ButtonListener listener = new ButtonListener(); // 按键监听 play.setOnClickListener(new ButtonListener()); pause.setOnClickListener(new ButtonListener()); stop.setOnClickListener(new ButtonListener()); } class ButtonListener implements Button.OnClickListener { @Override public void onClick(View v) { File f = (File) getIntent().getSerializableExtra("file"); Intent intent = new Intent(); intent.setClass(PlaySongActicity.this, PlayService.class); intent.putExtra("file", f); intent.putExtra("message", v.getId()); startService(intent); } }}
重点在红色部分,自己实在是没有办法了,希望路过的大侠们指点啊
[解决办法]
能描述的再详细点么?我的理解是你可以在onstartcommend中用if进行判断,if(mediaplayer==null){
creatMedia();
}
else{
...
}
[解决办法]
这里只是自己写的,可能比较粗糙,参考吧
/**
* MP3播放Service
* @author NOHI
* 2012-8-1
*/
public class Mp3PlayerService extends Service{
private Mp3Info mp3Info; //当前传入的mp3
private Mp3Info lastMp3Info;//上次mp3
MediaPlayer mediaPlayer;
private String mp3State;//mp3当前状态 nothing Play Pause Stop
@Override
public IBinder onBind(Intent intent) {
Log.d("Mp3PlayerService","当前MP3状态:" + mp3State);
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String intentType = intent.getStringExtra(Mp3PlayerMeteData.INTENT_TYPE);
mp3Info = (Mp3Info)intent.getSerializableExtra(Mp3PlayerMeteData.INTENT_TYPE_MP3INFO);
if (Mp3PlayerMeteData.MP3PLAYER_OPERATION_PLAY.equals(intentType)) {
playMp3();
}else if (Mp3PlayerMeteData.MP3PLAYER_OPERATION_PAUSE.equals(intentType)) {
pauseMp3();
}else if (Mp3PlayerMeteData.MP3PLAYER_OPERATION_STOP.equals(intentType)) {
stopMp3();
}
return 0;
}
/**
* 播放mp3
* author:NOHI
* date: 2012-8-1
*/
private void playMp3(){
Log.d("Mp3PlayerService", "lastMp3Info: " + lastMp3Info + " \n mediaPlayer: " + mediaPlayer + " ,\n mp3State: " + mp3State);
if ( null == lastMp3Info
|| !mp3Info.getMp3Name().equals(lastMp3Info.getMp3Name())
|| null == mediaPlayer
|| !Mp3PlayerMeteData.MP3PLAYER_OPERATION_PLAY.equals(mp3State) //不在播放状态
) {
if (!Mp3PlayerMeteData.MP3PLAYER_OPERATION_PAUSE.equals(mp3State)) {
//注意这里的path:file:/ 只能有一个 "/" 如果有"//"则报错
String path = "file:" + FileUtil.getExternalStorageDir(mp3Info.getMp3Name());
Log.d("Mp3PlayerService", path);
mediaPlayer = MediaPlayer.create(this, Uri.parse(path));
//当播放完时,设置状态
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp3State = null;
Intent intent = new Intent();
intent.setAction(Mp3PlayerMeteData.INTENT_TYPE_MP3_PLAY_END);
intent.putExtra(Mp3PlayerMeteData.INTENT_TYPE, Mp3PlayerMeteData.MP3PLAYER_OPERATION_END);
Mp3PlayerService.this.sendBroadcast(intent);
}
});
Log.d("Mp3PlayerService", "mediaPlayer: " + mediaPlayer);
mediaPlayer.setLooping(false);
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else if (Mp3PlayerMeteData.MP3PLAYER_OPERATION_PAUSE.equals(mp3State)) {//如果为暂停,则恢复运行
}
mediaPlayer.start();
lastMp3Info = mp3Info;
mp3State = Mp3PlayerMeteData.MP3PLAYER_OPERATION_PLAY;
}
}
/**
* 暂停mp3
* author:NOHI
* date: 2012-8-1
*/
private void pauseMp3(){
if ( null != lastMp3Info && null != mediaPlayer && mediaPlayer.isPlaying()
&& mp3Info.getMp3Name().equals(lastMp3Info.getMp3Name())
&& Mp3PlayerMeteData.MP3PLAYER_OPERATION_PLAY.equals(mp3State)
) {
mediaPlayer.pause();
mp3State = Mp3PlayerMeteData.MP3PLAYER_OPERATION_PAUSE;
}
}
/**
* 停止
* author:NOHI
* date: 2012-8-1
*/
private void stopMp3(){
if ( null != lastMp3Info && null != mediaPlayer
&& ( Mp3PlayerMeteData.MP3PLAYER_OPERATION_PLAY.equals(mp3State)
|| Mp3PlayerMeteData.MP3PLAYER_OPERATION_PAUSE.equals(mp3State)
)
&& mp3Info.getMp3Name().equals(lastMp3Info.getMp3Name())
) {
mediaPlayer.stop();
mediaPlayer.release();
mp3State = Mp3PlayerMeteData.MP3PLAYER_OPERATION_STOP;
}
}
}
