【问题标题】:Android MediaPlayer start called in State 1. Error -38,0Android MediaPlayer start 在状态 1 中调用。错误 -38,0
【发布时间】:2017-06-11 17:28:21
【问题描述】:

美好的一天!像往常一样 - 我开始学习 Android 编程,在尝试创建基本的 MediaPlayer 应用程序时遇到了意想不到的困难。音频文件存储在 res/raw 中。它通过 create() 访问。我已经阅读了一些关于如何构建媒体播放器应用程序的手册,并且确信如果文件存储在资源/原始文件夹。所以这是我的初始代码

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 called in state 1, mPlayer(0x0) E/MediaPlayer: error (-38, 0) E/MediaPlayer: Error (-38,0)

可能我只是犯了一些直截了当的错误。任何帮助将不胜感激。

【问题讨论】:

  • 您忘记在MediaPlayer 上致电prepare()
  • 据说create()已经做了prepare()
  • 是的,你是对的。但是一些与你的问题相同的答案说你需要打电话准备。试一试。
  • 已经试过了。它导致 IllegalStateException
  • 好吧,您也可以尝试另一种方法,不使用MediaPlayer.create(),而是使用数据源对其进行初始化

标签: java android


【解决方案1】:

自己解决

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();
            }


        }
    });

我知道我应该添加其他方法来更改状态,但主要目的是让它播放文件。

【讨论】:

  • 对我来说没有这样的工作,所以我初始化了 2 个媒体播放器,在完成第一个媒体播放器之前启动了第二个媒体播放器(在处理程序中)并暂停了第一个媒体播放器并寻求 0 毫秒。
  • 最好不要自己构造字符串路径。请参阅此答案以更好地设置myUristackoverflow.com/a/57719958/3422470
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多