Sre*_*v R 16 android smooth progress seekbar media-player
我正在使用带录音机和播放器的应用程序.我正在使用mediaplayer播放录制的.wav文件,同时我想更新到搜索栏.一切都工作正常但我的问题是媒体播放器进度更新到seekbar没有顺利发生,如果我们playig一个小文件,搜索栏的拇指在几秒钟或之间跳跃.
任何人都可以帮助我解决方法,使其顺利寻求seekbar的进展.我的代码如下所示.我被困在这里.
mediaPlayerIntiate();
mediaPlayerSetSource();
mMediaPlayer.start();
task = new TimerTask() {
@Override
public void run() {
Graphbar.post(new Runnable() {
@Override
public void run() {
if (mMediaPlayer != null) {
if (playButtonState == MediaMode.PLAY) {
if (mMediaPlayer.isPlaying()) {
Graphbar.setProgress(mMediaPlayer
.getCurrentPosition());
mediaPlayerUpdateTimer(mMediaPlayer
.getCurrentPosition());
enableRewindandForward();
}
}
}
}
});
}
};
timer = new Timer();
timer.schedule(task, 0, 8);
Run Code Online (Sandbox Code Playgroud)
Tof*_*mad 19
mMediaPlayer.getCurrentPosition()以毫秒为单位返回当前时间,并将此更新为Seekbar,最大容量为100.将一个公式设置为文件长度为100.尝试此函数
MediaPlayer mMediaPlayer = new MediaPlayer();
final SeekBar mSeelBar = new SeekBar(this);
final int duration = mMediaPlayer.getDuration();
final int amoungToupdate = duration / 100;
Timer mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (!(amoungToupdate * mSeelBar.getProgress() >= duration)) {
int p = mSeelBar.getProgress();
p += 1;
mSeelBar.setProgress(p);
}
}
});
};
}, amoungToupdate);
Run Code Online (Sandbox Code Playgroud)
当媒体播放器开始播放时应该调用此过程.内
mediaPlayer.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
**// call here**
});
Run Code Online (Sandbox Code Playgroud)
更新
在几秒钟内更新125次不是你应该做的事情.请增加更新SeekBar的间隔.我在阅读NullPointer的评论后添加了这个
seekbar.setProgress() 只接受 int。因此,我们大多数人倾向于将经过的百分比传递给这种方法。但是,如果您需要更平滑的进程,那么您可以使用以毫秒为单位的持续时间作为 MAX。然后我们每毫秒更新一次搜索栏的进度。下面是一个示例,我每 15 毫秒更新一次,因为几乎每部 android 手机的刷新率都是 60 fps(每秒帧数)。
try{
mediaPlayer.start();
seekbar.setProgress(0);
seekbar.setMax(mediaPlayer.getDuration());
// Updating progress bar
seekHandler.postDelayed(updateSeekBar, 15);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
/**
* Background Runnable thread
* */
private Runnable updateSeekBar = new Runnable() {
public void run() {
long totalDuration = mediaPlayer.getDuration();
long currentDuration = mediaPlayer.getCurrentPosition();
// Displaying Total Duration time
remaining.setText(""+ milliSecondsToTimer(totalDuration-currentDuration));
// Displaying time completed playing
elapsed.setText(""+ milliSecondsToTimer(currentDuration));
// Updating progress bar
seekbar.setProgress((int)currentDuration);
// Call this thread again after 15 milliseconds => ~ 1000/60fps
seekHandler.postDelayed(this, 15);
}
};
/**
* Function to convert milliseconds time to
* Timer Format
* Hours:Minutes:Seconds
* */
public String milliSecondsToTimer(long milliseconds){
String finalTimerString = "";
String secondsString = "";
// Convert total duration into time
int hours = (int)( milliseconds / (1000*60*60));
int minutes = (int)(milliseconds % (1000*60*60)) / (1000*60);
int seconds = (int) ((milliseconds % (1000*60*60)) % (1000*60) / 1000);
// Add hours if there
if(hours > 0){
finalTimerString = hours + ":";
}
// Prepending 0 to seconds if it is one digit
if(seconds < 10) {
secondsString = "0" + seconds;
}else {
secondsString = "" + seconds;
}
finalTimerString = finalTimerString + minutes + ":" + secondsString;
// return timer string
return finalTimerString;
}
Run Code Online (Sandbox Code Playgroud)