Я пытаюсь реализовать базовый MediaPlayer в приложении и иметь состояния изменения кнопки в зависимости от того, воспроизводится ли клип, воспроизведение завершено или воспроизведение прерывается вручную (по нажатие одной и той же кнопки).Проблемы с MediaPlayer - звуковой файл воспроизводится только один раз
С ниже код, я получаю следующие результаты:
На первой загрузки, звук воспроизводится нормально.
Если я снова нажимаю ImageButton во время воспроизведения, воспроизведение останавливается. Когда я снова нажимаю его, воспроизведение возобновляется с отметки времени, в которой оно было остановлено (я думал, что это странное поведение более типично для «паузы»().
После того, как воспроизведение завершено, смена кнопки отлично работает однако я не могу воспроизвести аудиофайле во второй раз. Когда я нажимаю старт, он начинает воспроизведение, затем сразу переходит в playbackcompleted, фактически не играет звук.
Я обыскивал через другие посты/google/android, но пока не нашли решения.
У меня также есть до сих пор:
setLooping (true); - это не имело никакого эффекта, кроме того, что setOnCompletionListener никогда не был достигнут. Звук не воспроизводился вообще.
В методе onCompletion, устанавливая seekTo() на несколько разных значений (0, 100) и используя сообщения журнала, включая «getCurrentPosition()», чтобы подтвердить, что это действительно делалось, но даже если это подтверждает это он начинается с позиции 0 или 100, результат все тот же (звук не слышен, и завершение происходит немедленно).
В методе onCompletion несколько комбинаций вызовов «stop()», «prepareAsync()» или даже prepare(). Результаты были одинаковыми, однако при последующих попытках (т. Е. Попытке 2, 3 и т. Д.) Для воспроизведения, когда был вызван метод onCompletion, я начал получать различные ошибки для вызова методов stop()/prepare() в неправильном состоянии.
final ImageButton pauseButton = (ImageButton) rootView.findViewById(R.id.playButton1); final MediaPlayer mediaPlayer = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.ch01_01); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { pauseButton.setImageResource(R.drawable.play_button); } }); pauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.prepareAsync(); pauseButton.setImageResource(R.drawable.play_button); } else { mediaPlayer.start(); pauseButton.setImageResource(R.drawable.stop_button); } } });
Любая помощь будет оценен по достоинству!
P.S. Я использую весь этот код в методе onCreateView для фрагмента в моем приложении. На всякий случай, если кто-то подумает, что это может иметь значение.
Я вижу две нечетные линии. Первый mediaPlayer.prepareAsync() после остановки игрока. prepareAsync() триггеры onPrepared listener, после которого вы можете запустить плеер. Таким образом, вам нужно переместить prepareAsync строку в блок «else», удалить mediaPlayer.start() из блока else в метод onPrepared. Прикрепите setOnPrepared прослушиватель к mediaPlayer. Пожалуйста, проверьте эту диаграмму: http://developer.android.com/images/mediaplayer_state_diagram.gif – bajicdusko
Привет, Спасибо за ответ! Аномалии, которые вы заметили, были всего лишь некоторыми вещами, с которыми я играл, чтобы увидеть, получаю ли я такое же поведение, когда останавливаюсь(); vs, когда он находится в состоянии Completed. Я снял стоп(); и prepareAsync(); и вместо этого заменяется на паузу(). Эта функция паузы работает нормально, это не моя проблема в настоящее время. Я просто хочу, чтобы он мог играть снова с самого начала после его завершения. После того, как он будет завершен, он никогда не будет воспроизводиться снова, пока я не выйду из операции и не вернусь. Когда он в PlaybackCompleted, я должен иметь возможность искать (0) и начинать заново, но это не сработает. –
Итак, я запускаю это на своей Samsung Galaxy S2 (работает Kitkat 4.4.4 Cyanogenmod). Я попытался вместо этого на своем Google Nexus 7 (2013) запустить Lollipop, и он работает именно так, как я хотел. Было потрачено несколько часов впустую * вздох * –