Java 在Android中播放音频时出现故障

Java 在Android中播放音频时出现故障,java,android,android-mediaplayer,Java,Android,Android Mediaplayer,我正在使用MediaPlayer在Android中播放音频MediaPlayer工作正常,但当我使用随音频持续时间更新的SeekBar时,音频播放不顺畅,播放时会中断。下面是我的代码片段供参考 mSongSeekBar.setMax(mMediaPlayer.getDuration()); mSongSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override

我正在使用MediaPlayer在Android中播放音频
MediaPlayer
工作正常,但当我使用随音频持续时间更新的SeekBar时,音频播放不顺畅,播放时会中断。下面是我的代码片段供参考

mSongSeekBar.setMax(mMediaPlayer.getDuration());
    mSongSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            mMediaPlayer.seekTo(progress);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    new Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            mSongSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
        }
    }, 0, 500);

这种行为的原因是什么?如何摆脱这个?我是否应该选择<强>计时器<强> > /p> < p>您可以考虑重写<代码> OnStestTrackAccess < /C>和<代码> OnTraceTrackAccess 方法。因为当您拖动搜索栏时,会频繁调用
onProgressChanged
,每次它都试图将媒体播放器设置为从特定位置播放,因此您的音频会出现破裂或中断


我建议在拖动搜索栏时暂时暂停媒体播放器,并在完成拖动后恢复音频。上述方法可能会帮助您实现这些行为

> P>您可以考虑重写<代码> OnTraceTrackAccess < /C>和<代码> OnTraceTrackAccess 方法。因为当您拖动搜索栏时,会频繁调用
onProgressChanged
,每次它都试图将媒体播放器设置为从特定位置播放,因此您的音频会出现破裂或中断


我建议在拖动搜索栏时暂时暂停媒体播放器,并在完成拖动后恢复音频。上述方法可能会帮助您实现这些行为

我也遇到了同样的问题,音频不断地自行寻找并导致故障。您需要确保仅在用户浏览音频时才查找音频,而不是在音频正常运行时。为此,onProgressChanged的boolean fromUser参数非常有用。这将确保仅当用户对音频进行筛选时才进行音频搜索

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
      if(fromUser){
        mMediaPlayer.seekTo(progress);
       }
    }

我也遇到了同样的问题,音频不断地自行寻找,并导致故障。您需要确保仅在用户浏览音频时才查找音频,而不是在音频正常运行时。为此,onProgressChanged的boolean fromUser参数非常有用。这将确保仅当用户对音频进行筛选时才进行音频搜索

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
      if(fromUser){
        mMediaPlayer.seekTo(progress);
       }
    }

原因

音频不是连续播放的,它每500毫秒就改变一次,所以它感觉很破碎。因为Timer()正在更改进度的值。当代码编写时,mMediaPlayer每次都会自动寻找它:

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        mMediaPlayer.seekTo(progress);
    }
如何摆脱这个问题

您应该使用boolean fromUser来更改音频的位置,只有当用户手动更改seekBar时,您才可以通过稍微更改(使用if)来完成此操作


原因

音频不是连续播放的,它每500毫秒就改变一次,所以它感觉很破碎。因为Timer()正在更改进度的值。当代码编写时,mMediaPlayer每次都会自动寻找它:

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        mMediaPlayer.seekTo(progress);
    }
如何摆脱这个问题

您应该使用boolean fromUser来更改音频的位置,只有当用户手动更改seekBar时,您才可以通过稍微更改(使用if)来完成此操作


但问题是,即使我没有滚动SeekBar!音频的正常播放正在中断。当我注释掉计时器实现时,它工作得非常好!所以,使用定时器实时更新音频的持续时间有一些问题。我明白了。事实上,它破裂的原因和我说的一样,我想。为什么你需要定时器呢?我正在用定时器更新SeekBar当前的音频持续时间。正如你们所看到的,计时器每0.5秒更新一次SeekBar。我得到了你们所说的。但只有当我拖动SeekBar时才会出现这种情况。在我的情况下,我没有拖动SeekBar,但音频仍在中断!但问题是,即使我没有滚动SeekBar!音频的正常播放正在中断。当我注释掉计时器实现时,它工作得非常好!所以,使用定时器实时更新音频的持续时间有一些问题。我明白了。事实上,它破裂的原因和我说的一样,我想。为什么你需要定时器呢?我正在用定时器更新SeekBar当前的音频持续时间。正如你们所看到的,计时器每0.5秒更新一次SeekBar。我得到了你们所说的。但只有当我拖动SeekBar时才会出现这种情况。在我的情况下,我没有拖动SeekBar,但音频仍在中断!这个对我有用!我现在能够理解破坏音频背后的实际原因:)这一个对我有用!我现在能够理解破坏音频背后的实际原因:)