Android MediaPlayer seekBar работает некорректно

Сейчас я разрабатываю медиаплеер и мне нужно seekBar для совместной работы, на данный момент все в порядке! но, когда я касаюсь определенной позиции панели поиска, медиаплеер должен следовать и установил песню в эту определенную позицию, но песня и seekBar Вернуться к началу, и я не знаю, почему это происходит.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Handler mHandler = new Handler();

    public TextView song_detail;
    public TextView time1;
    public TextView time2;
    private String player_status = "playing";
    private ImageButton player_img;

    public static SeekBar seekBar;

    private static MediaPlayer mediaPlayer;

    @SuppressLint("RestrictedApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        song_detail = findViewById(R.id.song_detail);
        song_detail.setVisibility(View.GONE);

        time1 = findViewById(R.id.time_1);
        time2 = findViewById(R.id.time_2);

        seekBar = findViewById(R.id.seekBar);

        final Runnable mRunnable = new Runnable() {
            @Override
            public void run() {
                if (mediaPlayer != null){
                    int CurrentPosition = mediaPlayer.getCurrentPosition();
                    String m_1;
                    String s_1;
                    seekBar.setProgress(CurrentPosition/1000);
                    final int minutes_1 = (CurrentPosition/1000)/60;
                    final int seconds_1 = ((CurrentPosition/1000)%60);

                    if (minutes_1 < 10) {
                        m_1 = "0" + minutes_1;
                    } else {
                        m_1 = "" + minutes_1;
                    }

                    if (seconds_1 < 10) {
                        s_1 = "0" + seconds_1;
                    } else {
                        s_1 = "" + seconds_1;
                    }
                    time1.setText(m_1 + ":" + s_1);


                    int Duration = mediaPlayer.getDuration();
                    String m_2;
                    String s_2;
                    final int minutes_2 = (Duration/1000)/60;
                    final int seconds_2 = ((Duration/1000)%60);

                    if (minutes_2 < 10) {
                        m_2 = "0" + minutes_2;
                    } else {
                        m_2 = "" + minutes_2;
                    }

                    if (seconds_2 < 10) {
                        s_2 = "0" + seconds_2;
                    } else {
                        s_2 = "" + seconds_2;
                    }

                    time2.setText(m_2 + ":" + s_2);

                }
                mHandler.postDelayed(this, 1000);
            }
        };
        mRunnable.run();


        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (mediaPlayer != null && fromUser){
                    Toast.makeText(getApplicationContext(), String.valueOf(progress), Toast.LENGTH_LONG).show();
                    mediaPlayer.seekTo(progress);
                    seekBar.setProgress(progress);
                }
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) { }

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

    public void initAudio(final Context context, final String url) {
        if (mediaPlayer == null) {
            mediaPlayer = MediaPlayer.create(context, Uri.parse(url));
        }
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                //Toast.makeText(context, "TEST", Toast.LENGTH_LONG).show();
                killMediaPlayer();
            }
        });
        seekBar.setMax(mediaPlayer.getDuration()/1000);
        mediaPlayer.start();
    }

    public void killMediaPlayer() {
        if (mediaPlayer != null) {
            try {
                mediaPlayer.reset();
                mediaPlayer.release();
                mediaPlayer = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    public static void pauseAudio() {
        if (!(mediaPlayer == null)) {
            mediaPlayer.pause();
        }
    }
    public static void startAudio() {
        if (!(mediaPlayer == null)) {
            mediaPlayer.start();
        }
    }
}

Это часть кода, которую я использую для работы с медиа плеер и seekBar

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (mediaPlayer != null && fromUser){
                    Toast.makeText(getApplicationContext(), String.valueOf(progress), Toast.LENGTH_LONG).show();
                    mediaPlayer.seekTo(progress);
                    seekBar.setProgress(progress);
                }
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) { }

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

Но, как я уже сказал, вместо того, чтобы mediaPlayer искать и продолжать звук с позиции, на которую я щелкнул, звук просто возвращается к началу. Что я делаю не так?

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
620
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Максимальное значение для progress - 100. Функция seekTo занимает время в миллисекундах. Вот почему он стремится к началу (почти) звука.

Итак, вместо mediaPlayer.seekTo(progress); нужно сделать:

long newTime = (progress/100.0) * total_audio_duration_in_millisecond; 
mediaPlayer.seekTo(newTime);

not currentDuration (), общая продолжительность: mediaPlayer.getDuration()

nupadhyaya 26.09.2018 03:25

Я получаю: error: incompatible types: possible lossy conversion from double to long на long newTime = (progress/100.0) * mediaPlayer.getDuration();

Karlna 26.09.2018 03:33
long newTime = (long) ((progress/100.0) * mediaPlayer.getDuration());
nupadhyaya 26.09.2018 03:36
error: incompatible types: possible lossy conversion from long to int
Karlna 26.09.2018 03:46

вы объявили newTime как int?

nupadhyaya 26.09.2018 03:55

Извините за путаницу. Просто введите long в int: mediaPlayer.seekTo((int)newTime);

nupadhyaya 26.09.2018 04:06

Он работает неправильно, я нажимаю на определенную позицию seekBar, и позиция другая.

Karlna 26.09.2018 04:30

по какой причине у вас есть seekBar.setProgress(progress); в onProgressChanged?

nupadhyaya 26.09.2018 04:32

удалить эту строку

nupadhyaya 26.09.2018 04:32

Готово, сэр, но когда я нажимаю на определенную позицию, звук переходит в другое

Karlna 26.09.2018 04:45

что значит "аудио переходит к другому"? Это идет на другой звук?

nupadhyaya 26.09.2018 04:51

Другая позиция, например, если я щелкну в 00:50, она перейдет в 02:38.

Karlna 26.09.2018 04:53

Откуда вы знаете, что щелкаете в 00:50?

nupadhyaya 26.09.2018 04:53

Это был просто пример. Я пытаюсь объяснить, что это неправильно

Karlna 26.09.2018 04:57
seekBar.setProgress(CurrentPosition/1000); этот код неверный
nupadhyaya 26.09.2018 05:01

это должен быть int progress=(int)((currentPosition/(float)totalDuration)*100); seekBar.setProgress(progress);

nupadhyaya 26.09.2018 05:03

Эта часть тоже правильная? seekBar.setMax(mediaPlayer.getDuration()/1000);

Karlna 26.09.2018 05:06

да удалите это .. пусть max для seekBar будет 100 (по умолчанию)

nupadhyaya 26.09.2018 05:08

Мой прогресс seekBar не обновляется, он завис при запуске

Karlna 26.09.2018 05:12

Привет, сэр, я решил проблему с помощью этого: progress*1000

Karlna 26.09.2018 05:42

Другие вопросы по теме