Android Studio: запуск и остановка аудио с помощью mediaPlayer - PullRequest
0 голосов
/ 20 января 2020

Как start и stop играть на музыке c с помощью одной и той же кнопки. Приведенный ниже код будет воспроизводить песню несколько раз (с наложением), если я щелкну по ней несколько раз.

И еще одна проблема заключается в том, где вставить функцию starTimer и StopTimer, чтобы starTimer был активен, если звук не воспроизводится. и stopTimer будет активен, если воспроизводится звук.

Обновленный код:

   public void playFile(View v) {
    if (mediaPlayer == null)
        mediaPlayer = new MediaPlayer();

    try {

        mediaPlayer.setDataSource(question.getAudio());

        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(@NotNull MediaPlayer mp) {
                mediaPlayer.start();
            }
        });
        mediaPlayer.prepareAsync();

    }catch (IOException e) {
        e.printStackTrace();
        stopSelf();
    }

    if (mediaPlayer.isPlaying()) {
        //pause music
        mediaPlayer.pause();
    } else {
        //play music
        mediaPlayer.start();
    }
}

Xml файл:

<Button
    android:id="@+id/audQuestion"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Play"
    android:onClick="playFile"
    android:layout_centerInParent="true"/>

и для функции startTimer stopTimer

public void starTimer() {
    timer = new Timer(Constant.TIME_PER_QUESTION, Constant.COUNT_DOWN_TIMER);
    timer.start();
}

public void stopTimer() {
    if (timer != null)
        timer.cancel();
}

Ответы [ 4 ]

0 голосов
/ 20 января 2020

Пожалуйста, укажите ниже код в Global:

private Button play_pause;
MediaPlayer mediaPlayer; 

Сейчас в onCreate Метод:

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

        mediaPlayer = new MediaPlayer();
        play_pause = findViewById(R.id.play_pause);
    }

Кнопка паузы воспроизведения:

play_pause.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mediaPlayer != null) {
                        if (mediaPlayer.isPlaying()) {
                            mediaPlayer.pause();
                        } else {
                            mediaPlayer.getDuration();
                            mediaPlayer.start();
                        }
                    } 
                }
            });

Когда звук готов к воспроизведению:

private void readyToPlay(Uri uri) {
        try {
            if (mediaPlayer != null) {
                mediaPlayer.setOnCompletionListener(this);
                mediaPlayer.setDataSource(activity, uri);//Write your location here
                mediaPlayer.prepare();
                mediaPlayer.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Звук завершен, после чего автоматически остановится:

@Override
    public void onCompletion(MediaPlayer mp) {
        if (mediaPlayer != null) {
            mp.stop();
            mp.release();
        }
    }

Не забудьте добавить эту строку:

implements MediaPlayer.OnCompletionListener
0 голосов
/ 20 января 2020

Для остановки музыки / звука с помощью медиаплеера создайте логическое значение isPlaying. Сделайте это правдой, когда музыка c играет

объявите isPlaying как глобальную переменную как

private boolean isPlaying = false;
@Override
public void onPrepared(MediaPlayer mp) {
    mp.start();
    isPlaying = true;
}

, теперь вы можете создать метод, который будет проверять значение isPlaying и воспроизведение или пауза в музыке c, вызовите этот метод onClick() кнопки

private playPauseMusic(){
    if (!isPlaying) {
        //play music
        isPlaying = true;
        mediaPlayer.start();
    } else {
        //pause music
        isPlaying = false;
        mediaPlayer.pause();
    }
}

надеюсь, это поможет!

0 голосов
/ 20 января 2020

Приведенный ниже код будет воспроизводить песню несколько раз (с наложением), если я нажимаю на нее несколько раз.

Поскольку вы создаете объект медиаплеера при каждом нажатии кнопки, чтобы решить эту проблему Сделайте так, чтобы ваш медиаплеер использовал объект класса, а не локальное поле метода, и сначала проверьте, не является ли объект нулевым, прежде чем создавать его экземпляр

MediaPlayer mediaPlayer;

public void playFile(View v) { 
    if (mediaPlayer == null)
        mediaPlayer = new MediaPlayer();

    // The reset of the code
    ...

И не нужно иметь переменную, чтобы проверить, воспроизводится ли медиа как вы можете проверить это непосредственно из объекта медиаплеера

if (mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
} else if () {
    mediaPlayer.start();
}

Поэтому измените свой код на

MediaPlayer mediaPlayer;

public void playFile(View v) {
    if (mediaPlayer == null)
        mediaPlayer = new MediaPlayer();

    try {

        mediaPlayer.setDataSource(question.getAudio());

        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(@NotNull MediaPlayer mp) {
                mediaPlayer.start();
            }
        });
        mediaPlayer.prepareAsync();

    }catch (IOException e) {
        e.printStackTrace();
        stopSelf();
    }

    if (mediaPlayer.isPlaying()) {
        //pause music
        mediaPlayer.pause();
    } else if () {
        //play music
        mediaPlayer.start();
    }
}

Для проблемы с таймером не так ясно, как вы реализуете свой таймер?

0 голосов
/ 20 января 2020

лучше сделать одно логическое значение при нажатии кнопки, а затем легко обработать

isClick - false означает, что если будет выполнено другое действие. В противном случае вы делаете остановку медиаплеера и функцию остановки таймера

boolean isClick=false;
public void playFile(View v){
    MediaPlayer mediaPlayer = new MediaPlayer(); if(!isClick){

    isClick=true;
        try {

            mediaPlayer.setDataSource(question.getAudio());

            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                     if( mediaPlayer.isPlaying() ) {
                     mediaPlayer.stop();}  mp.start();
                     starTimer();
                 }
             });
            mediaPlayer.prepareAsync();

        }catch (IOException e){
            e.printStackTrace();
            stopSelf();
        }

    }else{ 
        if( mediaPlayer.isPlaying() ) {
            mediaPlayer.stop();
            stopTimer();
        }
     isClick=false;
    }
}
...