Android 开发中遇到 Unable to create service java.lang.IllegalStateException 大家帮忙看看呗!

WindKun 2012-06-03 07:12:49
最近写了个用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
...全文
1708 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
AMinfo 2012-06-03
  • 打赏
  • 举报
回复
把第78行的musicPlayer.reset();改为musicPlayer.release();
WindKun 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
MyMediaPlayer.java码发上来看看
[/Quote]
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();
}

}
AMinfo 2012-06-03
  • 打赏
  • 举报
回复
MyMediaPlayer.java码发上来看看

80,493

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧