Android Media Player SeekBar не ищет файл песни - PullRequest
0 голосов
/ 23 ноября 2018

У меня возникли проблемы с работой Seekbar. Первая загружаемая песня не позволяет мне использовать SeekBar, но когда я загружаю вторую или третью песню, SeekBar будет работать для них.Я попытался инициализировать SeekBar после загрузки песни Uri dataSource, однако он по-прежнему демонстрировал то же поведение.

Есть идеи, как заставить SeekBar работать над первой песней?

Спасибо

...

public class MainActivity extends AppCompatActivity {

    final int REQUEST_OPEN_FILE = 1;
    MediaPlayer mediaPlayer = new MediaPlayer();
    Uri audioFileUri;
    /*SeekBar seekBar;*/
    /*TextView SongProgress = findViewById(R.id.SongProgress);*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
    }

    ...

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == REQUEST_OPEN_FILE) {
            if (resultCode == RESULT_OK) {
                audioFileUri = data.getData();
                SeekBar seekBar;
                seekBar = findViewById(R.id.seekbar);
                seekBar.setMax(mediaPlayer.getDuration());
                seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                        seekBar.setProgress(progress);
                        mediaPlayer.seekTo(progress);
                        /*int Minutes=((progress/1000)/60);
                        int Seconds=((progress/1000)%60);
                        int time = Minutes + Seconds;
                        SongProgress.setText(time);*/
                    }


                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {

                    }

                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {

                    }
                });

                    try {
                        if (mediaPlayer.isPlaying()) {
                            mediaPlayer.reset();
                            mediaPlayer.setDataSource(this, audioFileUri);
                            mediaPlayer.prepare();
                            mediaPlayer.start();
                            Toast.makeText(this, "Was Playing", Toast.LENGTH_SHORT);

                        }
                        else{
                            mediaPlayer.setDataSource(this, audioFileUri);
                            mediaPlayer.prepare();
                            mediaPlayer.start();
                            Toast.makeText(this, "Was not playing", Toast.LENGTH_SHORT);
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    ...

    ...
}

1 Ответ

0 голосов
/ 07 декабря 2018

Хорошо, я получил прогресс на панели поиска, чтобы он обновлялся с песней, так что строка поиска отслеживает аудиофайл во время его воспроизведения.Это был простой исполняемый файл с обработчиком, который я разместил здесь в коде.Вы должны иметь запускаемый цикл для отслеживания песни во время ее воспроизведения, чтобы обновить панель поиска.тогда вам нужно написать обработчик для вызова этого запускаемого цикла.Стоит отметить одну важную вещь, если вы не добавите логическое значение, если (fromUser) в поисковой строке, изменяющей прослушиватель, поток заставит его воспроизводить прерывисто, поскольку он также обновляет прогресс относительно функции обновления обновления seekBar.

    SeekBar seekBar;
    Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        seekBar = (SeekBar) findViewById(R.id.seekbar);

        ...
    }

    ...

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == REQUEST_OPEN_FILE) {
            if (resultCode == RESULT_OK) {
                audioFileUri = data.getData();
                try {

                    if (mediaPlayer.isPlaying()) {
                        seekBar.setProgress(0);
                        mediaPlayer.reset();
                        mediaPlayer.setDataSource(this, audioFileUri);
                        mediaPlayer.prepare();
                        mediaPlayer.start();
                        seekBar.setMax(mediaPlayer.getDuration()); // Set the Maximum range of the
                        Toast.makeText(this, "Was Playing", Toast.LENGTH_SHORT);
                    } else {
                        seekBar.setProgress(0);
                        mediaPlayer.setDataSource(this, audioFileUri);
                        mediaPlayer.prepare();
                        mediaPlayer.start();
                        seekBar.setMax(mediaPlayer.getDuration()); // Set the Maximum range of the
                        /*seekBar.getVisibility();
                        seekBar.setVisibility(View.INVISIBLE);*/
                        Toast.makeText(this, "Was not playing", Toast.LENGTH_SHORT);
                    }


                } catch (Exception e) {
                    e.printStackTrace();
                }
                int mediaPos = mediaPlayer.getCurrentPosition();
                int mediaMax = mediaPlayer.getDuration();
                seekBar.setMax(mediaMax); // Set the Maximum range of the
                seekBar.setProgress(mediaPos);// set current progress to song's

                handler.removeCallbacks(moveSeekBarThread);
                handler.postDelayed(moveSeekBarThread, 1000);
            }

        }

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(fromUser) {
                    seekBar.setProgress(progress);
                    mediaPlayer.seekTo(progress);
                }
                else{}
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }


private Runnable moveSeekBarThread = new Runnable() {
    public void run() {
        if(mediaPlayer.isPlaying()){
            int mediaPos_new = mediaPlayer.getCurrentPosition();
            int mediaMax_new = mediaPlayer.getDuration();
            seekBar.setMax(mediaMax_new);
            seekBar.setProgress(mediaPos_new);
            handler.postDelayed(this, 100); //Looping the thread after 0.1 second
            // seconds
        }else if(mediaPlayer.getCurrentPosition() == mediaPlayer.getDuration()){}
    }
};
...