2013-12-23 3 views
2

Проблема, с которой я сталкиваюсь в данный момент, заключается в том, что моя пауза не всегда работает. У меня есть MediaPlayer в основном действии, который управляется через ActionBarSherlock и onClick-слушатели. MediaPlayer использует ArrayList с URL-адресами файлов MP3 (некоторые из них длиной 1сек).Android MediaPlayer pause

код Pause:

 if (player.isPlaying()) { 
      if (player != null) { 
       player.pause(); 
       swapPlayIcon(1); 
       isPaused = true; 
       pauseMenuButt.setVisible(false); 
       playMenuButt.setVisible(true); 
      } 
     } 

swapPlayIcon (интермедиат) обрабатывает только видимость и рисуем свопы.

код Начало:

Iterator<Uri> iterUri = tracks.iterator(); 
    while (iterUri.hasNext()) { 
     Uri tmpUri = iterUri.next(); 
     try { 
      player.reset(); 
      player.setDataSource(String.valueOf(tmpUri)); 
      player.prepare(); 
      player.start(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

EDIT

После более тестирования я обнаружил, что проблема появляется в "между" государством.

Что я имею в виду, когда мой MP3-файл длится 2 секунды, и я нажимаю на паузу, чтобы он не останавливался, потому что он просто закончил чтение одного файла и теперь перешел к следующему.

Я добавил:

 } else { 
      pauseLocked = true; 
     } 

, чтобы сделать паузу, если Постулаты и не приземляется в нем на все время тестирования. Так что я не уверен в проблеме «между ними», о которой я узнал ранее.

+1

Не уверен, что такое ответ, но важно отметить, что у вас есть некоторый потенциал для исключения NullPointerException в этом первом блоке ... вы скажете if (player.isPlaying()) и THEN проверьте для игрока! = Null , Если игрок был нулевым, вы бы увидели NPE при вызове player.isPlaying(). Вы должны либо перенести нулевую проверку из инструкции isPlaying() if, либо полностью удалить ее. – Matt

+0

Да, вы действительно правы:> – JakubW

+0

Сначала воспроизведение не блокируется, поэтому вы будете циклически перемещаться по медиа так же быстро, как игрок может подготовить каждый медиапоток с вашего URL-адреса. Во-вторых, вы на [4.4 и пытаетесь играть в HLS] (http://code.google.com/p/android/issues/detail?id=63346&q=HLS&colspec=ID%20Type%20Status%20Owner%20Summary% 20Stars)? – dcow

ответ

1

Ваша кнопка pause не работает, потому что ее сообщение никогда не доходит до MediaPlayer до тех пор, пока вы не запустили последний URL-адрес. Вы полностью блокируете поток, на котором работает MediaPlayer (я предполагаю, что это поток пользовательского интерфейса, поскольку MediaPlayer находится в вашем основном действии). Если вы создаете свой MediaPlayer в том же потоке, что и ваш пользовательский интерфейс, вы должны использовать асинхронную версию prepare: prepareAsync. Вам нужно ответить, как только вы получите обратный вызов onMediaPrepared, а затем запустите медиа. Как только это произойдет, вы ничего не должны делать и дождитесь окончания печати, только тогда вы должны загрузить другой URL-адрес.

+0

Хорошо, я попытаюсь это сделать, спасибо за помощь. – JakubW

+0

Да, воспроизведение в медиа может быть довольно запутанным, чтобы понять. Сам мультимедийный проигрыватель является сложным конечным автоматом, и ваша операционная деятельность должна правильно управлять всеми этими состояниями. Что-то вроде простое, как цикл, хотя аудиопотоки выйдут довольно сложно. Удачи! – dcow

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