2014-07-09 5 views
0

음악 플레이어 앱이있어서 트랙의 어느 부분을 재생해야하는지 자릅니다. 내 질문은 현재 미디어 플레이어 트랙이 노래의 끝에 도달하지 않은 경우에도 다음 노래를 재생하는 방법입니다. 나는 또한 onCompletion를 호출 시도 :현재 노래의 끝 부분에 도달하지 않고 MediaPlayer의 다음 노래를 재생하는 방법

mplayer.stop(); 

     Log.v("PLAYER", "Audio track Stopped"); 
     checkTrackStatus(); 
     songHandler.removeCallbacks(uxUpdater); 
     if(fis!=null)fis=null; 

     if((currentTrack+1) < songs.size()) 
     { 

      Log.v("Move to next track", songs.get(currentTrack+1).get("songTitle")); 
      //mplayer.release(); 
      mplayer=null; 
      currentTrack++; 
      playSong(currentTrack); 

     }else 
      Toast.makeText(getApplication(), "All tracks played", Toast.LENGTH_LONG).show(); 

재생 SONG 방법 : 내가 항상 말하는 오류가

public void playSong(final int songIndex) 
{ 
     File toPlay = new File(songs.get(songIndex).get("songPath")); 

     lblTrackText.setText("Playing ["+(songIndex+1)+"/"+songs.size()+"]"); 
     lblTrackTitle.setText(songs.get(songIndex).get("songTitle")); 
     //lblTrackTitle.setSelected(true); 


     Log.v("PLAY SONG : ", toPlay.getPath()); 
     if(toPlay.exists()) 
     { 
      //playAudio(toPlay); 

      try{ 

       mplayer = new MediaPlayer(this); 
       //mplayer.setOnCompletionListener(this); 
       fis=new FileInputStream(new File(songs.get(songIndex).get("songPath"))); //ORIGINAL 'p' 
       mplayer.setDataSource(fis.getFD());//need to add permission in manifest to play .m4a files "ACCESS_NETWORK_STATE" 

       mplayer.prepare(); 




       //final String s =p; 
       mplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 

        //getTotalTrackDuration 

        @Override 
        public void onPrepared(MediaPlayer mp) { 
         mplayer.seekTo(Integer.parseInt(songs.get(songIndex).get("songStart"))); 
         mplayer.start(); 
         //lblTotal.setText(timeConverter(mplayer.getDuration())); 
         setTrackNo(); 

         //Log.v("NOW PLAYING ", s); 
         updateProgress(); 
        } 
       }); 

     } catch (Exception e) { 
      Log.e("AUDIO PLAYER", "error: " + e.getMessage(), e); 
     } 

     } 
     else 
      Toast.makeText(getApplication(), songs.get(songIndex).get("songTitle")+" does not exist or is already deleted", Toast.LENGTH_LONG).show(); 


} 

오류 (1, -541478725) 치명적인 신호 11 (SIGSEGV)에서 0x00002ad8 (코드 = 1)

나는 vitamio 미디어 플레이어를 사용하고 있습니다.

어떤 도움을 당신이 얻을 오류는 vitamino 미디어 플레이어에 누워 있어야합니다 네이티브 코드에서 버그가 있음을 나타냅니다 great..thanks

답변

1

될 것이다. 받은 오류는 메모리 버그 인 것 같습니다. 리소스가 해제되지 않고 메모리가 부족하다고 생각하게 만듭니다. 전화를 추가

보십시오 : 코드 전에

fis.close() 

:

if(fis!=null)fis=null; 

당신이 제대로 이전 곡으로 스트림을 종료하고 있는지 확인합니다.

this answer 귀하의 문제는 loading a lot of images and sounds and causing the app to run out of memory 일 수도 있습니다. 또한 안드로이드의 다른 버전을 가진 다른 장치가 이것을 다르게 처리 할 수 ​​있는데, 이는 앱이 하나의 전화기에서 작동 할 수는 있지만 다른 제품에서는 작동하지 않는다는 것을 의미합니다.

+0

니스! 호기심에서 벗어나 무엇을 바꾸어야합니까? :) – Pphoenix

+1

고마워요. .. 해결책을 생각해 냈습니다. 지정된 종료 시간 (w/c는 트랙의 종료 시간이 아님)에 도달하면 [MediaPlayerObj] .seekTo ([MediaPlayerObj] .getDuration()) oncompletion 메서드를 호출하려면 ... hehe – MetaSnarf

+0

@MetaSnarf : 아주 좋습니다! – Pphoenix