我正在一个项目上,我试图播放类似WhatsApp的音频文件。 假设用户连续发送了三个文件,**我想像WhatsApp一样播放/暂停/恢复音频文件**-
我想做什么:
如果我单击第一个音频文件(播放按钮),则应在暂停时单击它开始播放;如果我单击暂停,它应停止播放;如果再次单击播放,则应从暂停位置开始播放(恢复音频文件)。
其他情况是,如果第一个文件正在播放,而我单击了第二个文件,则第一个文件应停止播放(而不是暂停),第二个文件应开始播放第二个音频文件,并且单击播放第三文件的第二个文件应暂停,第三个音频文件应开始播放。如果我单击播放第一个文件,则第三个文件应暂停,第一个文件应恢复播放。
我做了什么: 我正在使用MediaPlayer在recylerview中播放音频文件。我可以播放和暂停文件,但是在暂停(如何存储每个文件的最后位置)之后,当我播放第一个文件并单击第二个文件时,两个文件都继续播放,而不是最近播放的文件。 >
尝试::我试图在堆栈中找出问题,但是有很多问题,例如暂停播放和恢复,这些都无法帮助我解决问题,一半的问题没有答案,一半的问题没有解决。用户不再使用堆栈溢出(最后一次看到)。
我的问题:暂停后如何恢复每个文件,如何保存上一个位置?
代码: 我正在使用MVVM体系结构,并且我的代码编写在其中一个视图持有者中。
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.audio_play_button:
mAudioPauseButton.setVisibility(View.VISIBLE);
mAudioPlayButton.setVisibility(View.INVISIBLE);
play();
break;
case R.id.audio_pause_button:
mAudioPauseButton.setVisibility(View.INVISIBLE);
mAudioPlayButton.setVisibility(View.VISIBLE);
pause();
break;
default:
break;
}
}
我正在使用两个图标来暂停播放并单击时处理可见性。
private void play() {
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
setAudioUrltoMediaPlayer();
} else {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
} else {
setAudioUrltoMediaPlayer();
}
}
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
if (mMediaPlayer != null) {
mMediaPlayer.start();
totalTime = mMediaPlayer.getDuration();
mTextChatAudioTime.setText(millisecondsToString(totalTime));
mAudioSeekBar.setProgress(0);
mAudioSeekBar.setMax(totalTime);
mAudioSeekBar.setClickable(true);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
mAudioSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
}
}, 0, 200);
mAudioSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@SuppressLint("SetTextI18n")
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mMediaPlayer.seekTo(progress);
}
final long mMinutes = (progress / 1000) / 60;//converting into minutes
final int mSeconds = ((progress / 1000) % 60);//converting into seconds
mTextChatAudioTime.setText(mMinutes + ":" + mSeconds);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int CurrentLevel = mAudioSeekBar.getProgress();
if (CurrentLevel < 30)
CurrentLevel = 30;
mAudioSeekBar.setProgress(CurrentLevel);
}
});
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mAudioPauseButton.setVisibility(View.INVISIBLE);
mAudioPlayButton.setVisibility(View.VISIBLE);
mMediaPlayer.stop();
}
}, 200);
}
});
}
}
});
}
private void setAudioUrltoMediaPlayer() {
if (setAudioUrl != null) {
Log.d("audio file", "available" + setAudioUrl);
try {
Log.d("setAudioUrl", ">>>>>>>>>>>>>>>>>>>>>" + setAudioUrl);
mMediaPlayer.reset();
mMediaPlayer.setDataSource(setAudioUrl);
mMediaPlayer.prepare();
mMediaPlayer.setVolume(1.0f, 1.0f);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (IOException e) {
e.printStackTrace();
}
} else {
Log.d("audio file", "available" + setAudioUrl);
}
}
private void pause() {
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
//lastposition = mMediaPlayer.getCurrentPosition();
mMediaPlayer.pause();
}
}
}
答案 0 :(得分:3)
这是几年前我写的mediaplayer。
这有一个播放播放列表的选项。它还具有“播放”,“暂停”,“下一步”,“上一步”按钮及其动作。
您可以根据需要修改应用程序。 您可以在recyclerview中显示您的播放列表,然后在项目单击时将其作为广播发送出去播放。
让我知道是否需要更多帮助。
答案 1 :(得分:0)
您可以存储当前正在播放的视频的位置。然后,如果您正在播放其他视频,则停止存储位置的视频并更新位置。
对于恢复视频,您可以通过在模型文件中包含参数来存储视频的运行时间。您可以从停止视频的位置继续播放视频。
这是恢复vdo的说明
How to stream a video to play from a particular time in android?