Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Воспроизводить аудио при нажатии на кнопку

#java #android #аудио


Есть коллекция, которая хранит названия аудио

songs = new ArrayList<>();
songs.add("song_1.ogg");
songs.add("song_2.ogg");
songs.add("song_3.ogg");
songs.add("song_4.ogg");
songs.add("song_5.ogg");
songs.add("song_6.ogg");


Есть метод, который проигрывает аудио в зависимости от того, какое значение передано.

private void playSong(int i) {
    String mSong = songs.get(i);
    try {
        AssetFileDescriptor afd = this.getAssets().openFd("sounds/songs/" + mSong);
        mp = new MediaPlayer();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        mp.setLooping(false);
        mp.prepare();
        mp.start();
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.release();
            }
        });
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}


Есть кнопка, по нажатию на который нужно проигрывать аудио так: Нажали один раз начинается
проигрывание аудио из коллекции song_1.ogg, нажали второй раз первое остановилось началось
проигрывание аудио song_2.ogg и т.д. до аудио song_6.ogg. Если нажать еще раз, то опять
проигрывать аудио song_1.ogg и т.д.

Как это реализовать? Логику просто подскажите. А то я сделала так, и у меня начинают
играть несколько аудио если я несколько раз нажму на кнопку

счетчик

private int counter = 0;


блок case

case R.id.btnMusic:
    if (counter == 0) {
        play(0);
    } else if (counter == 1) {
        mp.release();
        play(1);
    } else if (counter == 2) {
        mp.release();
        play(2);
    } else if (counter == 3) {
        mp.release();
        play(3);
    } else if (counter == 4) {
        mp.release();
        play(4);
    } else if (counter == 5) {
        mp.release();
        play(5);
    }
    break;


Сам метод

private void play(int i) {
    counter = i;
    String mSong = songs.get(counter);
    try {
        AssetFileDescriptor afd = this.getAssets().openFd("sounds/songs/" + mSong);
        mp = new MediaPlayer();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        mp.setLooping(false);
        mp.prepare();
        mp.start();
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.release();
            }
        });
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

    


Ответы

Ответ 1



Вставьте в методе play(), что-то типа: if(mp.isPlaying()) { mp.stop(); mp.reset(); } А сам плеер надо создавать 1 раз, а то вы создаете при каждом обращении новый экземпляр плеера.

Комментариев нет:

Отправить комментарий