Я работаю над одним проектом, я пытался проигрывать аудио файлы, такие как 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();
}
}
}