0

我已经被这个问题困扰了很长一段时间了。在 mediaPlayer 中,我创建的所有内容在初始播放阶段都运行顺利,但是当用户选择下一个或上一个选项时,应用程序会给我(0,-107) error一个attempt to call getDuration without a valid mediaplayer

编码:

      public void playPodCast(int index) {
        try {
            urlToSend = toGet.get(index).get("URL").toString();

            mediaPlayer.reset();
            mediaPlayer.setDataSource(urlToSend);
            mediaPlayer.prepareAsync();
            onPlayerLoad();
            mediaPlayer.setOnPreparedListener(this);

            mediaPlayer.setOnErrorListener(this);

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

    }

这里onPlayerLoad()只是一种在 mediaPlayer 加载时隐藏所有视图的方法。

@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    onPlayerLoaded();
    updateProgressBar();
    mediaPlayer.start();
}

onPlayerLoaded()负载回到视图上。

public void updateProgressBar() {
    seekHandler.postDelayed(updateSeekTime, 100);
}

private Runnable updateSeekTime = new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        long totalDuration = mediaPlayer.getDuration();
        long currentDuration = mediaPlayer.getCurrentPosition();

        // Displaying the total time duration
        seekRight.setText("" + utils.milliSecondsToTimer(totalDuration));
        // Displaying completed playing time
        seekLeft.setText("" + utils.milliSecondsToTimer(currentDuration));

        // Updating the SeekBar progress
        int progress = (int) (utils.getProgressPercentage(currentDuration,
                totalDuration));
        seekBar.setProgress(progress);

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

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser) {
    // TODO Auto-generated method stub
}

// @Override
public void onStartTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub
    seekHandler.removeCallbacks(updateSeekTime);
}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub
    seekHandler.removeCallbacks(updateSeekTime);
    int totalDuration = mediaPlayer.getDuration();
    int currentPosition = utils.progressToTimer(seekBar.getProgress(),
            totalDuration);

    // forward or backward to certain seconds
    mediaPlayer.seekTo(currentPosition);

    // update timer progress again
    updateProgressBar();
}

这里,private Handler seekHandler = new Handler();

就像我之前说的,最初的调用playPodCast(index)不会给我任何错误,它工作得非常顺利。但是当用户点击下一个和上一个按钮时,就会产生错误。如果在没有 的情况下实施,下一个和上一个方法不会给出任何错误updateProgressBar(),一切都可以正常运行。那么为什么我会收到此错误?我不知道为什么......请帮忙。

这是下一个按钮的实现:

btnNext.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        if (getPosition == totalList - 1) {
            getPosition = 0;
            playPodCast(getPosition);
        } else {
            getPosition = getPosition + 1;
            playPodCast(getPosition);
        }
                    }
});

getPosition被引用的媒体文件的位置在哪里。

我也尝试过

@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    mediaPlayer.start();
    onPlayerLoaded();
    updateProgressBar();
}

更新1:

我发现在使用时出现错误prepareAsync(),程序运行良好prepare()但超级滞后。

4

2 回答 2

1

问题是在新媒体准备时getDuration被你打电话。updateSeekTask这会出错。未准备的视频的持续时间是多少?

解决方案是取消updateSeekTask用户单击下一步时的任何回调,并在媒体准备好后恢复它们。

public void onClick(View arg0) {
    if (getPosition == totalList - 1) {
        getPosition = 0;
        seekHandler.removeCallbacks(updateSeekTime); // Cancel me! 
        playPodCast(getPosition);
    } else {
        getPosition = getPosition + 1;
        seekHandler.removeCallbacks(updateSeekTime); // Cancel me!
        playPodCast(getPosition);
    }
}

然后onPrepared像现在一样重新启动任务:

public void onPrepared(MediaPlayer mp) {
    mediaPlayer.start();
    onPlayerLoaded();
    updateProgressBar();
}

您仍然应该使用prepareAsync. 如果你只是使用prepare一切将等到媒体准备好。这就是您所经历的滞后。它将解决您的问题(因为即使任务也会等待),但不建议这样做。

于 2013-10-25T09:01:05.730 回答
0

而不是调用以下内容:

int totalDuration = mediaPlayer.getDuration();

在内部Runnable updateSeekTime()创建totalDuration一个全局变量并参考初始化 totalDuration 的值,onPrepared(MediaPlayer mp)如下所示:

@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    onPlayerLoaded();
    totalDuration = mp.getDuration() // mp is the MediaPlayer instantiated by this method
    updateProgressBar();
    mediaPlayer.start();
} 

和Presto你完成了......希望这对某人有所帮助。

于 2013-10-25T05:49:34.317 回答