Android: MediaPlayer Play, Pause, Resume audio file, например WhatsApp - PullRequest
0 голосов
/ 03 июня 2019

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

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Это медиаплеер , который я написал несколько лет назад.

У него есть опция для воспроизведения плейлиста.Он имеет кнопки Play, Pause, Next, Prev и их действия.

Вы можете изменить приложение в соответствии с вашими потребностями.Вы можете показать свой плейлист в режиме просмотра, а затем, щелкнув по элементу, вы можете отправить элемент в виде трансляции для воспроизведения.

Дайте мне знать, если вам нужна дополнительная помощь.

0 голосов
/ 13 июня 2019

Вы можете сохранить положение текущего видео. Если вы воспроизводите другое видео, остановите видео сохраненной позиции и обновите положение.

Для возобновления видео вы можете сохранить время воспроизведения:видео с параметром в файле модели. Вы можете возобновить видео с того места, где вы его остановили.

Вот описание возобновления vdo

Как транслировать видео наиграть с определенного времени в Android?

...