Java 在Android中播放音频时出现故障
我正在使用MediaPlayer在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
工作正常,但当我使用随音频持续时间更新的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,但音频仍在中断!这个对我有用!我现在能够理解破坏音频背后的实际原因:)这一个对我有用!我现在能够理解破坏音频背后的实际原因:)