SeekBar не перемещается, когда MediaPlayer приостановлен и обработан вручную - PullRequest
0 голосов
/ 17 июня 2019

У меня есть приложение аудиоплеера, и есть кнопка Play / Pause, связанная с SeekBar. Если mediaPlayer находится в состоянии воспроизведения, каждое взаимодействие пользователя с полосой хорошо воспринимается, полоса очень отзывчива и правильно связана с длительностью аудиоклипа. Теперь вот проблема ... Если mediaPlayer поставлен на паузу, каждое взаимодействие пользователя с большим пальцем панели заставляет его сбрасывать свой прогресс до 0%, пока он все еще находится в режиме паузы, когда он должен был оставаться там, где его поставил пользователь. Как только mediaPlayer возобновляется, оно начинается с того места, куда пользователь указал, когда оно было приостановлено. Таким образом, я явно что-то упускаю, и большой палец бара кажется на 0%, если нажать, когда mediaPlayer на паузе.

создание seekBar:

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    //Detecting seekBar's movement.
    @Override
    public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) {
        if (fromUser) {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.seekTo(progress); //Procedural link of mediaPlayer and seekBar.
            } else {
                seekBar.setProgress(0); //Dictates that seekBar is unusable whenever mediaPlayer is inoperable.
            }
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar bar) {}

    @Override
    public void onStopTrackingTouch(SeekBar bar) {}
});

Кнопка воспроизведения / паузы:

private void usePlayBtn() {
    //Called when playBtn is pressed.
    if(mediaPlayer != null) {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
            playBtn.setImageResource(R.drawable.play);

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                //Detects mediaPlayer's task completion.
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    completion();
                }
            });
        } else {
            mediaPlayer.start();
            playBtn.setImageResource(R.drawable.pause);
            changeSeekBar();
        }
    }
}

метод changeSeekBar:

private void changeSeekBar() {
    //Changes seekBar's progress in correspondence to mediaPlayer's progress.
    seekBar.setProgress(mediaPlayer.getCurrentPosition());

    if (mediaPlayer.isPlaying()) {
        runnable = new Runnable() {
            @Override
            public void run() {
                changeSeekBar();
            }
        };
        handler.postDelayed(runnable, 10); //Controls the flow of the SeekBar's movement (fewer ms means that the SeekBar's progress refreshes faster, motion appears smoother).
    }
}
...