最近写了个用MediaPlayer播放MP3的播放器,播放时启动了Service,我想在模拟器上按返回键时在onDestroy()中停止服务,将音乐播放器给停止了,停止倒是能停止,只是我再次在应用中打开时就会报上面的错误,点击OK后再启动播放器时又可以正常播放了,哪位帮我分析下是怎么回事啊!
下面是报的错:
06-03 11:13:53.272: E/AndroidRuntime(914): FATAL EXCEPTION: main
06-03 11:13:53.272: E/AndroidRuntime(914): java.lang.RuntimeException: Unable to create service com.wind.musicplayer.serviec.MusicPlayerService: java.lang.IllegalStateException
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:2263)
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.app.ActivityThread.access$1600(ActivityThread.java:123)
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.os.Looper.loop(Looper.java:137)
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.app.ActivityThread.main(ActivityThread.java:4424)
06-03 11:13:53.272: E/AndroidRuntime(914):  at java.lang.reflect.Method.invokeNative(Native Method)
06-03 11:13:53.272: E/AndroidRuntime(914):  at java.lang.reflect.Method.invoke(Method.java:511)
06-03 11:13:53.272: E/AndroidRuntime(914):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-03 11:13:53.272: E/AndroidRuntime(914):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-03 11:13:53.272: E/AndroidRuntime(914):  at dalvik.system.NativeStart.main(Native Method)
06-03 11:13:53.272: E/AndroidRuntime(914): Caused by: java.lang.IllegalStateException
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.media.MediaPlayer._reset(Native Method)
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.media.MediaPlayer.reset(MediaPlayer.java:1190)
06-03 11:13:53.272: E/AndroidRuntime(914):  at com.wind.musicplayer.handle.MyMediaPlayer.initMusicPlayer(MyMediaPlayer.java:78)
06-03 11:13:53.272: E/AndroidRuntime(914):  at com.wind.musicplayer.handle.MyMediaPlayer.<init>(MyMediaPlayer.java:46)
06-03 11:13:53.272: E/AndroidRuntime(914):  at com.wind.musicplayer.serviec.MusicPlayerService.onCreate(MusicPlayerService.java:40)
06-03 11:13:53.272: E/AndroidRuntime(914):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:2253)
06-03 11:13:53.272: E/AndroidRuntime(914):  ... 10 more

解决方案 »

  1.   

    package com.wind.musicplayer.handle;import java.io.IOException;
    import java.util.List;import android.content.Context;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnCompletionListener;
    import android.net.Uri;
    import android.os.Bundle;import com.wind.musicplayer.po.MusicInfo;/**
     * @category: 操作类 Description: 对播放器的操作
     * @author Wind Create Date: 2012-05-26
     */
    public class MyMediaPlayer { public static final int MUSIC_PLAY = 1;
    public static final int MUSIC_NEXT = 2;
    public static final int MUSIC_PREVIOUS = 3;
    public static final int MUSIC_ITEM = 4;
    public static final int MUSIC_SEEKBAR = 5;
    public static final String MUSIC_ITEM_ID = "play_id";
    public static String MUSIC_KEY = "music";
    public static String KEY_MUSIC_STATE = "MusicState";
    public static String KEY_MUSIC_NAME = "MusicName"; public static MediaPlayer musicPlayer;
    private List<MusicInfo> list;
    private int play_id;
    private Context context;
    private Intent intent;
    private Bundle bundle;
    private int seek_progress; public MyMediaPlayer(Context context, int play_id, List<MusicInfo> list) {
    this.list = list;
    this.context = context;
    this.play_id = play_id;

    this.bundle = new Bundle();

    musicPlayer = initMusicPlayer();

    }

    public void setSeek_progress(int seek_progress) {
    this.seek_progress = seek_progress;
    } public void setPlay_id(int play_id) {
    this.play_id = play_id;
    }
    public void setIntent(Intent intent) {
    this.intent = intent;
    } /**
     * Description: 初始化MediaPlayer
     * 
     * @author Wind
     * @param mid
     */
    public MediaPlayer initMusicPlayer() { // 获得歌曲路径
    String musicPath = list.get(play_id).getMusicPath(); // 解析歌曲路径,获得播放器初始化的Uri
    Uri musicUri = Uri.parse(musicPath);
    // 当切换歌曲时,对媒体播放器进行重置
    if (musicPlayer != null) {
    musicPlayer.reset();
    try {
    musicPlayer.setDataSource(musicPath);
    musicPlayer.prepare(); } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (SecurityException e) {
    e.printStackTrace();
    } catch (IllegalStateException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } } else { // 初始化媒体播放器
    musicPlayer = MediaPlayer.create(context, musicUri);
    } musicPlayer.setOnCompletionListener(new OnCompletionListener() { @Override
    public void onCompletion(MediaPlayer mp) {
    musicPlayer.stop();
    playNext();
    }
    }); return musicPlayer;
    } // 根据获得的按键值判断要执行的操作
    public void playerHandle(int playerHandle) { switch (playerHandle) {
    case MUSIC_PLAY:
    playSong();
    break;
    case MUSIC_NEXT:
    playNext();
    break;
    case MUSIC_PREVIOUS:
    playPrevious();
    break;
    case MUSIC_ITEM:
    playIetm();
    break;
    case MUSIC_SEEKBAR:
    musicPlayer.seekTo(seek_progress);
    break;
    }
    } // 点击ListViewItem
    public void playIetm() {
    initMusicPlayer();
    playSong();
    } // 上一首
    public void playPrevious() {
    if (play_id == 0) {
    play_id = list.size() - 1;
    musicPlayer = initMusicPlayer();
    } else {
    --play_id;
    musicPlayer = initMusicPlayer();
    } playSong(); } // 播放歌曲
    public void playSong() { // 判断MediaPlayer是否被初始化
    if (musicPlayer != null) { // 如果歌曲正在播放执行下列操作
    if (musicPlayer.isPlaying()) {
    sendPlayerState("noplaying");
    // 将歌曲置为停止状态
    musicPlayer.pause();
    // 如果没有歌曲播放,执行如下操作
    } else { sendPlayerState("playing");
    // 播放歌曲
    musicPlayer.start();
    } } } // 发送播放状态
    public void sendPlayerState(String state) {
    bundle.putString(KEY_MUSIC_STATE, state);
    bundle.putString(KEY_MUSIC_NAME, getSongName());
    intent.putExtras(bundle);
    context.sendBroadcast(intent);
    } // 下一首
    public void playNext() {
    if (play_id == list.size() - 1) {
    play_id = 0;
    musicPlayer = initMusicPlayer();
    } else {
    ++play_id;
    musicPlayer = initMusicPlayer();
    } playSong(); } // 获得歌曲的名字
    public String getSongName() {
    return list.get(play_id).getMusicName().replace(".mp3", "");
    } // 释放资源
    public void playerRelease() {
    musicPlayer.release();
    }}
      

  2.   

    把第78行的musicPlayer.reset();改为musicPlayer.release();