Кнопка Play and Stop не работает вместе - PullRequest
0 голосов
/ 23 марта 2020

У меня есть 2 кнопки в моем макете. 1. Play / Pause 2. Stop Play и кнопка паузы работает отлично, но когда кнопка stop не работает. На самом деле я не знаю, где начинается проблема.

Вот мой код

            case R.id.playBtn:
            if (mediaPlaying){
                mediaPlaying = false;
                mPlayer.pause();
                playedLength = mPlayer.getCurrentPosition();
                playButton.setBackgroundResource(R.drawable.play);
            }else{
                mediaPlaying = true;
                if(mPlayer == null){
                    // create the media player
                    mPlayer = new MediaPlayer();
                    mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            public void onCompletion(MediaPlayer mp) {
                                mediaPlaying = false;
                                playedLength = 0;
                                playButton.setBackgroundResource(R.drawable.play);
                            }
                        });
                    try {
                        afd = getAssets().openFd(""+AUDIO+"");
                        mPlayer.setDataSource(afd.getFileDescriptor());
                        mPlayer.prepare();
                        mPlayer.start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else
                // resume playing
                mPlayer.seekTo(playedLength);
                mPlayer.start();
                playButton.setBackgroundResource(R.drawable.pause);
            }

            break;

        case R.id.stopBtn:
            if (mediaPlaying){
                mediaPlaying = false;
                if (mPlayer != null){
                    mPlayer.stop();
                    mPlayer = null;
                    playButton.setBackgroundResource(R.drawable.play);
                    }
            }else{
                mediaPlaying = true;
                Toast.makeText(getApplicationContext(), "Added to favorites.", Toast.LENGTH_SHORT).show();
                if (mPlayer != null){
                    mPlayer.pause();
                    mPlayer.seekTo(0);
                    }
            }
            break;

Я хочу сделать это. Когда вы нажимаете кнопку «Стоп», полностью останавливаете игрока, независимо от того, играет он или приостановлен. , Во время игры, если я нажимаю «Стоп», проигрыватель перезагружается, но когда он останавливается и нажимает «Стоп», он не перезапускается. Любая помощь приветствуется.

Обновление

case R.id.playBtn:
            if (state == PlayerState.PLAYING){
                mPlayer.pause();
                playedLength = mPlayer.getCurrentPosition();
                playButton.setBackgroundResource(R.drawable.play);
            }else if (state == PlayerState.PLAYING){

                if(mPlayer == null){
                    // create the media player
                    mPlayer = new MediaPlayer();
                    mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            public void onCompletion(MediaPlayer mp) {
                                mediaPlaying = false;
                                playedLength = 0;
                                playButton.setBackgroundResource(R.drawable.play);
                            }
                        });
                    try {
                        afd = getAssets().openFd(""+AUDIO+"");
                        mPlayer.setDataSource(afd.getFileDescriptor());
                        mPlayer.prepare();
                        mPlayer.start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else
                // resume playing
                mPlayer.seekTo(playedLength);
                mPlayer.start();
                playButton.setBackgroundResource(R.drawable.pause);
            }

            break;

        case R.id.stopBtn:
            if (state == PlayerState.STOPPED){
                if (mPlayer != null){
                    mPlayer.stop();
                    mPlayer = null;
                    playButton.setBackgroundResource(R.drawable.play);
                    }
            }else if (state == PlayerState.PAUSED){
                Toast.makeText(getApplicationContext(), "Added to favorites.", Toast.LENGTH_SHORT).show();
                if (mPlayer != null){
                    mPlayer.pause();
                    mPlayer.seekTo(0);
                    }
            }
            break;

1 Ответ

0 голосов
/ 23 марта 2020

Причина, по которой вы испытываете другое поведение, если логическое значение mediaPlaying будет иметь разные значения при нажатии кнопки остановки. Он остановит игрока, только если значение равно true, и если вы нажмете «Стоп», когда игрок остановлен, это будет false, поэтому ваш код не остановит игрока.

Я предлагаю добавить PlayerState enum для например (PLAYING, STOPPED, PAUSED) вместо использования логических значений. Тогда вам будет проще узнать, в каком состоянии находится игрок и какие действия предпринять.

In в коде

public enum PlayerState {
    PLAYING,
    STOPPED,
    PAUSED
}

Затем вы создаете переменную и устанавливаете начальное состояние (так же, как вы делаете для mediaPlaying (и в том же месте в вашем приложении))

private PlayerState state = PlayerState.STOPPED;

, а затем в своем коде вы заменяете места, где вы управляете mediaPlaying, и заменяете if (mediaPlaying) на if- операторы типа

if (state == PlayerState.PLAYING) { ...

Как только это будет сделано, вам больше не понадобится логическое mediaPlaying. И у вас есть более точные сведения о состоянии медиаплеера в ваших приложениях.

Какой-то код состояния, сложный, поскольку у меня нет всего кода. В каждом случае проверьте переход состояния, а затем установите состояние (которого нет в вашем коде)

        case R.id.playBtn:
            if (state == PlayerState.PLAYING){
                // logic here for going from playing to paused
                state = PlayerState.PAUSED;
            } else if (state != PlayerState.PLAYING){
                // logic from non playing to playing
                state = PlayerState.PLAYING;
            }
            break;
        case R.id.stopBtn:
            if (state == PlayerState.PLAYING){
                // logic if playing
            } else if (state == PlayerState.PAUSED){
                // logic if paused
            }
            state = PlayerState.STOPPED;
            break;
...