我尝试播放流媒体音乐背景和,我用下面的音乐服务类:Android的MediaPlayer的准备失败:状态=与流媒体音乐为0x1
public class MusicService extends Service implements
OnErrorListener, MediaPlayer.OnCompletionListener {
private static final int NOTIFICATION_ID = 1;
private final IBinder mBinder = new ServiceBinder();
MediaPlayer mPlayer;
private int length = 0;
private Notification mNotification;
public MusicService() {
}
@Override
public void onCompletion(MediaPlayer mp) {
mPlayer.stop();
}
public class ServiceBinder extends Binder {
public MusicService getService() {
return MusicService.this;
}
}
@Override
public IBinder onBind(Intent arg0) {
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
mPlayer = new MediaPlayer();
mPlayer.setOnCompletionListener(this);
mPlayer.setOnErrorListener(this);
if (mPlayer != null) {
mPlayer.setLooping(true);
mPlayer.setVolume(100, 100);
}
mPlayer.setOnErrorListener(new OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
onError(mPlayer, what, extra);
return true;
}
});
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// mPlayer.start();
return START_STICKY;
}
public void startMusic(String path) {
Toast.makeText(this, "pause music", Toast.LENGTH_SHORT).show();
if (mPlayer.isPlaying()) {
mPlayer.release();
}
try {
SongController s = (SongController) DBControllerFactory.getController("queue", this);
Log.d("MusicService", Config.SERVICE_ROOT_URL + "uploads/" + ((Song) s.select()[s.getTotalRows() - 1]).getFile() + ".mp3");
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(Config.SERVICE_ROOT_URL + "uploads/" + ((Song) s.select()[s.getTotalRows() - 1]).getFile() + ".mp3");
mPlayer.prepare(); /////error at here
mPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void pauseMusic() {
Toast.makeText(this, "pause music", Toast.LENGTH_SHORT).show();
if (mPlayer.isPlaying()) {
mPlayer.pause();
length = mPlayer.getCurrentPosition();
}
}
public void resumeMusic() {
Toast.makeText(this, "resume music", Toast.LENGTH_SHORT).show();
if (mPlayer.isPlaying() == false) {
mPlayer.seekTo(length);
mPlayer.start();
}
}
public void stopMusic() {
//setUpAsForeground("test");
Toast.makeText(this, "stop music", Toast.LENGTH_SHORT).show();
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mPlayer != null) {
try {
mPlayer.stop();
mPlayer.release();
} finally {
mPlayer = null;
}
}
}
public boolean onError(MediaPlayer mp, int what, int extra) {
Toast.makeText(this, "music player failed", Toast.LENGTH_SHORT).show();
if (mPlayer != null) {
try {
mPlayer.stop();
mPlayer.release();
} finally {
mPlayer = null;
}
}
return false;
}
void setUpAsForeground(String text) {
Intent openIntent = new Intent(getApplicationContext(), MainScreenActivity.class);
openIntent.putExtra("action", "opendrawer");
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),
0,
openIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
mNotification = new Notification();
mNotification.tickerText = text;
mNotification.icon = R.drawable.ic_launcher;
mNotification.flags |= Notification.FLAG_ONGOING_EVENT;
mNotification.setLatestEventInfo(getApplicationContext(),
getResources().getString(R.string.app_name), text, pi);
startForeground(NOTIFICATION_ID, mNotification);
}
}
当第一次的音乐播放时,它工作正常,但第二次它给了以下错误:
java.io.IOException: Prepare failed.: status=0x1
W/System.err﹕ at android.media.MediaPlayer._prepare(Native Method)
W/System.err﹕ at android.media.MediaPlayer.prepare(MediaPlayer.java:1125)
......
,但如果我删除设备我的应用程序的缓存它再次工作正常。所以我认为这是与缓存有关的问题,但我无法确定问题谁能帮助我吗?
Thaks回复...!我已经尝试过记录并获取正确的源路径,正如我第一次播放它时所说的那样,但在此之后它不起作用,即使我关闭了应用程序并重新开始了应用程序,但它在我删除应用程序缓存时仍然有效。 – vedraiyni 2015-03-19 14:29:53
借助你在这里的小解释,我猜想有一个媒体播放器没有获得释放的问题。或者如果它确实如此,我认为它应该使用相同的音频源文件再次创建。 所以现在你需要做一些工作。 1.您必须发布,重置并销毁mediaplayer实例 2.使用源重新创建mediaplayer实例 3.再次启动 – 2015-03-20 05:56:34
问题:正如您所说的那样,即使关闭应用程序并关注应用程序,它也不起作用再次,但它的作品,如果我删除应用程序的缓存“,,,, 记住,你在服务工作,所以你必须明确地销毁它0r停止并再次启动它。因为在其他情况下,服务将继续运行,您的onDestroy方法是不会打电话 – 2015-03-20 06:01:13