2014-12-29 5 views
0

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

С ниже код, я получаю следующие результаты:

  1. На первой загрузки, звук воспроизводится нормально.

  2. Если я снова нажимаю ImageButton во время воспроизведения, воспроизведение останавливается. Когда я снова нажимаю его, воспроизведение возобновляется с отметки времени, в которой оно было остановлено (я думал, что это странное поведение более типично для «паузы»().

  3. После того, как воспроизведение завершено, смена кнопки отлично работает однако я не могу воспроизвести аудиофайле во второй раз. Когда я нажимаю старт, он начинает воспроизведение, затем сразу переходит в playbackcompleted, фактически не играет звук.

Я обыскивал через другие посты/google/android, но пока не нашли решения.

У меня также есть до сих пор:

  1. setLooping (true); - это не имело никакого эффекта, кроме того, что setOnCompletionListener никогда не был достигнут. Звук не воспроизводился вообще.

  2. В методе onCompletion, устанавливая seekTo() на несколько разных значений (0, 100) и используя сообщения журнала, включая «getCurrentPosition()», чтобы подтвердить, что это действительно делалось, но даже если это подтверждает это он начинается с позиции 0 или 100, результат все тот же (звук не слышен, и завершение происходит немедленно).

  3. В методе 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 для фрагмента в моем приложении. На всякий случай, если кто-то подумает, что это может иметь значение.

+0

Я вижу две нечетные линии. Первый mediaPlayer.prepareAsync() после остановки игрока. prepareAsync() триггеры onPrepared listener, после которого вы можете запустить плеер. Таким образом, вам нужно переместить prepareAsync строку в блок «else», удалить mediaPlayer.start() из блока else в метод onPrepared. Прикрепите setOnPrepared прослушиватель к mediaPlayer. Пожалуйста, проверьте эту диаграмму: http://developer.android.com/images/mediaplayer_state_diagram.gif – bajicdusko

+0

Привет, Спасибо за ответ! Аномалии, которые вы заметили, были всего лишь некоторыми вещами, с которыми я играл, чтобы увидеть, получаю ли я такое же поведение, когда останавливаюсь(); vs, когда он находится в состоянии Completed. Я снял стоп(); и prepareAsync(); и вместо этого заменяется на паузу(). Эта функция паузы работает нормально, это не моя проблема в настоящее время. Я просто хочу, чтобы он мог играть снова с самого начала после его завершения. После того, как он будет завершен, он никогда не будет воспроизводиться снова, пока я не выйду из операции и не вернусь. Когда он в PlaybackCompleted, я должен иметь возможность искать (0) и начинать заново, но это не сработает. –

+0

Итак, я запускаю это на своей Samsung Galaxy S2 (работает Kitkat 4.4.4 Cyanogenmod). Я попытался вместо этого на своем Google Nexus 7 (2013) запустить Lollipop, и он работает именно так, как я хотел. Было потрачено несколько часов впустую * вздох * –

ответ

0

Очевидно, эта проблема - это просто мой Samsung Galaxy S2, поскольку тот же код работает отлично, как и ожидалось на моем Nexus 7 (2013), работающем с Lollipop 5.0.1.

Вопрос на Galaxy S2 включает в себя следующее:

  1. После того, как MediaPlayer находится в состоянии PlaybackCompleted, он не будет играть тот же самый файл во второй раз, когда игра нажата

  2. Попытка для запуска методов в состоянии PlaybackCompleted (который должен быть действительным в соответствии с документацией на Android), похоже, что-то делает (т.е.seekTo (0); на самом деле будет искать 0, но аудиофайл никогда не будет воспроизводиться во второй раз.

+0

Не думая об этом больше, в настройках разработчика (Lollipop) вы можете найти отмеченную опцию «Использовать NuPlayer (вместо Awesome Player)». Я бы сделал дополнительный тест с эмулированными устройствами (разными API) – bajicdusko

Смежные вопросы