Java Android MediaPlayer启动在状态1中调用。错误-38,0
你好!和往常一样,我开始学习Android编程,在尝试创建基本的MediaPlayer应用程序时遇到了意想不到的困难。音频文件存储在res/raw中。可以使用create()访问它。我已经阅读了一些关于如何构建媒体播放器应用程序的手册,并且确信如果文件存储在res/raw文件夹中,则不需要使用prepare()和prepareAsync()。这是我的初始代码Java Android MediaPlayer启动在状态1中调用。错误-38,0,java,android,Java,Android,你好!和往常一样,我开始学习Android编程,在尝试创建基本的MediaPlayer应用程序时遇到了意想不到的困难。音频文件存储在res/raw中。可以使用create()访问它。我已经阅读了一些关于如何构建媒体播放器应用程序的手册,并且确信如果文件存储在res/raw文件夹中,则不需要使用prepare()和prepareAsync()。这是我的初始代码 private MediaPlayer playerM = new MediaPlayer(); @Override protected
private MediaPlayer playerM = new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button playButton = (Button) findViewById(R.id.playButton);
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playMusic(R.raw.sleep_away);
}
});
Button stopButton = (Button) findViewById(R.id.pauseButton);
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopMusic();
}
});
}
private void playMusic(int rid) {
playerM.create(this, rid);
playerM.start();
}
private void stopMusic() {
playerM.stop();
}
}
从那以后,我做了很多改变,但没有任何帮助。根据MediaPlayer上的dev.android手册,上面的代码应该可以工作。但是,它会导致以下错误:
E/MediaPlayer:start在状态1下调用,mPlayer(0x0)
E/MediaPlayer:错误(-38,0)
E/MediaPlayer:错误(-38,0)
也许我只是犯了个直率的错误。任何帮助都将不胜感激。我自己解决
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
Uri myUri = Uri.parse("android.resource://" + v.getContext().getPackageName() + "/" + R.raw.sleep_away);
System.out.println(myUri);
playerM.setDataSource(v.getContext(), myUri);
playerM.prepare();
playerM.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer playerM){
playerM.start();
}
});
}catch(IOException e){
e.printStackTrace();
}
}
});
我知道我应该添加其他方法来更改状态,但主要目的是让它播放文件 你忘了在
MediaPlayer
上调用prepare()
?据说create()
已经做了prepare()
是的,你是对的。但有些问题与你的答案相同,你需要打电话给prepare。试试看,我已经试过了。它会导致非法状态例外。您也可以尝试另一种方法,不使用MediaPlayer.create()
,而是使用数据源初始化它。对我来说,事情是这样的,所以我初始化了两个媒体播放器,在完成第一个媒体播放器之前,启动了第二个媒体播放器(在处理程序中)暂停第一个媒体播放器,并寻找0毫秒。