Android:MediaPlayer播放,暂停,恢复音频文件(如WhatsApp)

时间:2019-06-03 10:40:12

标签: java android android-mediaplayer

我正在一个项目上,我试图播放类似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 个答案:

答案 0 :(得分:3)

这是几年前我写的mediaplayer

这有一个播放播放列表的选项。它还具有“播放”,“暂停”,“下一步”,“上一步”按钮及其动作。

您可以根据需要修改应用程序。 您可以在recyclerview中显示您的播放列表,然后在项目单击时将其作为广播发送出去播放。

让我知道是否需要更多帮助。

答案 1 :(得分:0)

您可以存储当前正在播放的视频的位置。然后,如果您正在播放其他视频,则停止存储位置的视频并更新位置。

对于恢复视频,您可以通过在模型文件中包含参数来存储视频的运行时间。您可以从停止视频的位置继续播放视频。

这是恢复vdo的说明

How to stream a video to play from a particular time in android?