2013-03-26 3 views
2

У меня есть проигрыватель Media Player в фоновом режиме. Файлы MP3 устанавливаются на TCP-сервере с сервера на моем рабочем столе. При отладке приложения песни отправляются и принимаются. Селекция песен структурирована в трех действиях. Активность в списке альбомов (просмотр списка) приведет вас к активности списка композиций (списка). вы выбираете песни, выбирая флажок и нажав кнопку воспроизведения. Кнопка воспроизведения привязывается к сервису, и песня запрашивается по tcp. Все песни добавляются в память телефона. Вот метод, который получает байт [] SETN над TCP (форма Thisis в myMediaPlayer класса:Android Media Player на слушателе завершения не работает должным образом

public void AddSong(byte[] toParse, String songName) 
     { 
      File cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),"MusicStreamCache"); 
      if(!cacheDir.exists()) 
       cacheDir.mkdirs(); 

      File temp = new File(cacheDir, songName); 
      FileOutputStream fos; 
      try { 
       fos = new FileOutputStream(temp); 
       fos.write(toParse); 
       fos.close(); 
      } catch (FileNotFoundException e) { 

       e.printStackTrace(); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 
      songs.add(temp); 
      if(!mediaPlayer.isPlaying() && !isPaused) 
      { 
       MediaPlay(); 
      } 

     } 

     public void AddSong(File filein) 
     { 
      filein.deleteOnExit(); 
      songs.add(filein); 
      if(!mediaPlayer.isPlaying() && !isPaused && CurrentSong == 0) 
      { 
       MediaPlay(); 
      } 
     } 

     public void MediaPlay() 
     { 
      if(!mediaPlayer.isPlaying() && CurrentSong <= songs.size()) 
      { 
       mediaPlayer.reset(); 
       try{ 
         @SuppressWarnings("resource") 
        FileInputStream fis = new FileInputStream(songs.get(CurrentSong)); 
         mediaPlayer.setDataSource(fis.getFD()); 

         mediaPlayer.prepare(); 
         int length = mediaPlayer.getDuration(); 
         mediaPlayer.start(); 
         if(CurrentSong <= songs.size()) 
         { 
          CurrentSong ++; 
         } 

        } 
       catch(Exception err) 
       { 
        @SuppressWarnings("unused") 
        String error = err.getMessage(); 
       } 

       mediaPlayer.setOnCompletionListener(completionListener); 

      } 
     } 

     OnCompletionListener completionListener = new OnCompletionListener(){ 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       if(CurrentSong <= songs.size()) 
       { 
        MediaPlay(); 
       } 

      } 

     }; 

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

Проблема возникает, когда я выбираю запустить приложение из Eclipse (без отладки), а затем отсоединяться от рабочего стола (чтобы проверить когда сигнал Wi-Fi слабый или в разных местах вокруг дома). Если я выберу песню, она загрузится и сыграет нормально. Однако, если я выбираю более одной песни, первая песня играет хорошо, но дальнейшие песни не будут воспроизводиться. Они загружаются, как если бы я выбирал новую песню, когда первая песня перестала воспроизводить следующую песню в списке при воспроизведении загруженных песен, а только что выбранная песня загружалась, но не воспроизводится. Я не могу понять, почему это происходит?

Поскольку у меня нет таких проблем, когда я отлаживаю. Мне интересно, не работает ли мой сервис, когда он не подключен к рабочему столу? Или я пропущу что-то очевидное? Я добавил частичный замок слежения к моему медиаплееру, но его, похоже, не облегчает проблему? Любые советы были бы оценены :-)

+0

Вы перезагружаете медиаплеер, когда песня останавливается? – Codeman

+0

Я возвращаюсь в приемник завершения завершения, который работает при отладке, но не при запуске – Luthervd

ответ

2

Найден ответ :-)

Это кажется, что, имея класс медиа-плеер, содержащий объект медиа-плеер и некоторые специальные методы были останавливая onCompletionListener от работы (за исключением, когда отладка). Чтобы обойти это, моя служба теперь реализует OnCompletionListener, и объект Media Player создается непосредственно в службе. В методе OnComplete я выпускаю текущий медиаплеер и создаю новый. Все работает так, как ожидалось.

Если кто-то может пролить свет на то, почему мое оригинальное решение не работает, я хотел бы лучше понять, что я делал неправильно в первую очередь!

+0

Старый, но как подсказка, а не релиз, сброс. – frostymarvelous

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