0

我试图改变这个项目媒体播放器的一些功能,从原始文件夹而不是从 SD 卡中读取 mp3。但它给我一个错误“尝试在没有有效媒体播放器的情况下调用getDuration”请任何建议?

 public void  playSong(int songIndex){ // parameter is not used. is set static content

    try {
        mp.reset();
        mp = mp.create(this, R.raw.ledzepellin); // static content!
        mp.prepare();
        mp.start();

        String songTitle = "title";
        songTitleLabel.setText(songTitle);


        songProgressBar.setProgress(0);
        songProgressBar.setMax(100);


        updateProgressBar();

    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


public void updateProgressBar() {
    mHandler.postDelayed(mUpdateTimeTask, 100);
}


private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        long totalDuration = mp.getDuration(); // ---- HERE IT GIVE ME ERROR
        long currentDuration = mp.getCurrentPosition();


        songTotalDurationLabel.setText(""+utils.milliSecondsToTimer(totalDuration));

        songCurrentDurationLabel.setText(""+utils.milliSecondsToTimer(currentDuration));


        int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));

        songProgressBar.setProgress(progress);


        mHandler.postDelayed(this, 100);
    }
};

在这里,我开始 playSong 方法,它首先打开我一个可用歌曲的列表视图,当我选择 ti 时给我返回结果,但它不重要的原始源是静态设置的

       btnPlaylist.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            Intent i = new Intent(getApplicationContext(), PlayListActivity.class);
            startActivityForResult(i, 100);
        }
    });

}

@Override
protected void onActivityResult(int requestCode,
                                int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == 100){
        currentSongIndex = data.getExtras().getInt("songIndex");

        playSong(currentSongIndex);
    }

}
4

1 回答 1

2

create您正在调用的静态方法的文档说:

成功时,prepare() 将已经被调用,并且不能再次调用。

没有其他错误被打印到 logcat 吗?您可能会考虑使用添加错误侦听器setOnErrorListener,并查看此处的状态图。大多数方法不应在MediaPlayer空闲或错误状态时调用。在你的情况下,我相信它已经进入错误状态,prepare()并且应该从那时起导致问题。

于 2013-10-11T15:36:32.427 回答