首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android的service有关问题

2012-09-13 
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;
}
}
}

热点排行
Bad Request.