Страницы

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

вторник, 9 октября 2018 г.

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

Есть коллекция, которая хранит названия аудио
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(); } }


Ответ

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

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

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