2017-12-10 22 views
1

그래서 내가 가지고있는 문제는 내가 노래의 끝에 내 검색 막대를 드래그 할 때, 그것은 일부 곡에서 작동하고 난 다음 단계로 이동하지만, 때로는 노래를 건너 뛰고 재생을 중지합니다. 예;재생 다음 곡 oncompletion

임 노래 노래가 recyclerview에 표시되는 클릭하면 내 songactivity 내 mainactivity에서 전달되는 "위치 1"에서.

난 끝까지 내 검색 막대를 드래그 할 때, 그것은 2로 이동 한 후 3, 4, 그러나 위치이 발생합니다 5.

에서 노래를 재생하지 않았다, 그래서 그것은, 6으로 건너 뜁니다 내 seekbar를 노래의 끝으로 끌면 다음 및 이전 버튼이 작동합니다. 내 songActivity

mCurrentIndex = (int) b.get("songIndex"); 

    if (mediaPlayer.isPlaying()){ 
     mBtnPlayPause.setImageResource(R.drawable.ic_action_pause_white); 
     updateProgressBar(); 
    } 

    tvSongListSize.setText((songIndex + 1) + "/" + songList.size()); 

    mBtnShuffle.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (isShuffle){ 
       isShuffle = false; 
       Toast.makeText(getApplicationContext(), "Shuffle is off", Toast.LENGTH_SHORT).show(); 
       mBtnShuffle.setImageResource(R.drawable.ic_action_shuffle); 
      }else{ 
       isShuffle = true; 
       Toast.makeText(getApplicationContext(), "Shuffle is on", Toast.LENGTH_SHORT).show(); 
       mBtnShuffle.setImageResource(R.drawable.ic_shuffle_on); 
       isRepeat = false; 
       mBtnRepeat.setImageResource(R.drawable.ic_action_repeat); 
      } 
     } 
    }); 

    mBtnRepeat.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (isRepeat){ 
       isRepeat = false; 
       Toast.makeText(getApplicationContext(), "Repeat is off", Toast.LENGTH_SHORT).show(); 
       mBtnRepeat.setImageResource(R.drawable.ic_action_repeat); 
      }else{ 
       isRepeat = true; 
       Toast.makeText(getApplicationContext(), "Repeat is on", Toast.LENGTH_SHORT).show(); 
       mBtnRepeat.setImageResource(R.drawable.ic_repeat_on); 
       isShuffle = false; 
       mBtnShuffle.setImageResource(R.drawable.ic_action_shuffle); 
      } 
     } 
    }); 


    mBtnPlayPause.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 
       if (mediaPlayer != null) { 
        if (mediaPlayer.isPlaying()) { 
         mediaPlayer.pause(); 
         mBtnPlayPause.setImageResource(R.drawable.ic_action_play); 
        } else { 
         mediaPlayer.start(); 
         mBtnPlayPause.setImageResource(R.drawable.ic_action_pause_white); 
        } 
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
         @Override 
         public void onCompletion(MediaPlayer mp) { 
          mBtnPlayPause.setImageResource(R.drawable.ic_action_play); 
         } 
        }); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    mBtnNext.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      nextSong(); 
     } 
    }); 

    mBtnPrev.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      prevSong(); 
     } 
    }); 
} 

private void playSongNumber(int index) { 
    try{ 
     mediaPlayer.reset(); 
     mediaPlayer.setDataSource(songList.get(index).getData()); 
     mediaPlayer.prepareAsync(); 
     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.start(); 
      } 
     }); 

     seekBar.setProgress(0); 
     seekBar.setMax(100); 

     updateProgressBar(); 

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

private void nextSong(){ 
     mCurrentIndex++; 
     mCurrentIndex %= songList.size(); 
     playSongNumber(mCurrentIndex); 
     mBtnPlayPause.setImageResource(R.drawable.ic_action_pause_white); 
     tvSongListSize.setText((mCurrentIndex + 1) + "/" + songList.size()); 
     Toast.makeText(getApplicationContext(), "You Clicked position: " + mCurrentIndex + " " + songList.get(mCurrentIndex).getData(), Toast.LENGTH_SHORT).show(); 
    } 

private void prevSong(){ 
    mCurrentIndex = mCurrentIndex > 0 ? mCurrentIndex - 1 : songList.size() - 1; 
    playSongNumber(mCurrentIndex); 
    mBtnPlayPause.setImageResource(R.drawable.ic_action_pause_white); 
    tvSongListSize.setText((mCurrentIndex + 1) + "/" + songList.size()); 
    Toast.makeText(getApplicationContext(), "You Clicked position: " + mCurrentIndex + " " + songList.get(mCurrentIndex).getData(), Toast.LENGTH_SHORT).show(); 

} 

@Override 
public void onCompletion(MediaPlayer mp) { 
    if (isRepeat){ 
     playSongNumber(mCurrentIndex); 
    }else if(isShuffle){ 
     Random random = new Random(); 
     mCurrentIndex = random.nextInt((songList.size() - 1) + 1); 
     tvSongListSize.setText((mCurrentIndex + 1) + "/" + songList.size()); 
     playSongNumber(mCurrentIndex); 
    }else if (mCurrentIndex < songList.size()-1){ 
     nextSong(); 
     tvSongListSize.setText((mCurrentIndex + 1) + "/" + songList.size()); 
    }else{ 
     playSongNumber(0); 
     tvSongListSize.setText((1) + "/" + songList.size()); 
    } 
} 

public void updateProgressBar(){ 
    mHandler.postDelayed(mUpdateTime, 100); 
} 

private Runnable mUpdateTime = new Runnable() { 
    @Override 
    public void run() { 
     long songCurrentTime = mediaPlayer.getCurrentPosition(); 
     long songTotalTime = mediaPlayer.getDuration(); 

     tvSongCurrentTime.setText(""+utilities.msToTimer(songCurrentTime)); 
     tvSongTotalTime.setText(""+utilities.msToTimer(songTotalTime)); 

     int progress = (int)(utilities.getProgressPercentage(songCurrentTime, songTotalTime)); 
     seekBar.setProgress(progress); 

     mHandler.postDelayed(this, 100); 
    } 
}; 

건배에서

이 코드

는 또한 노래 (2 번 보여주는 토스트를) 건너 뜁니다 것으로 나타났다.

두 번째 문제

내가 노래를 클릭 해결, 그것은 songActivity로 이동하고 다음 노래는 onCompletion가 호출 될 때 재생,하지만 난 후 일시 정지 버튼을 누른 때 다시 재생 노래가 끝나면 멈추고 다음 노래가 재생되지 않습니다.

셋째

난 내 목록의 마지막 노래에 가서 그렇게 OnCompletion가 호출 밖으로 놀자, 그것은 좋은 내 목록의 첫 번째 노래로 돌아갑니다 문제,하지만 난 이전 버튼을 클릭하여 마지막 노래로 돌아 가면 마지막 노래를 건너 뜁니다. 예 : 마지막 노래가 위치이다 [25], 그 위치에서 노래로 되돌아 간다 완료되면 [0] (첫 노래),하지만이 [24]과 스킵 [25]로 진행 뒤로 '버튼을 클릭하면 (마지막 노래). oncompletion가 호출 될 때

에만 발생합니다.

+0

오류가 발생했습니다. 오류는 내 완료에 있지만 표시되지 않습니다. – Vince

답변

1

일부 오류가 런타임에 일어나고 있기 때문에 이런 일이 당신이 OnErrorListener을 구현하지 않았습니다.

MediaPlayer 객체에 OnErrorListener을 구현하지 않으면 어떤 오류가 발생하면 OnCompletionListener이 호출 될 것이라고 언급됩니다.

은 그래서 'OnErrorListener'을 구현하고, 그렇지 않은 경우 오류가 처리 거짓 된 경우에 true를 돌려줍니다. false를 다시 표시하면 OnCompletionListener이 다시 호출됩니다.

현재 안드로이드 문서를 참조 할 수 있습니다 : https://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener.html

편집 : 코드에서 발견 한 하나의 큰 문제는 playSongNumber() 방법 내부 updateProgressBar()를 호출하지만 onPrepared가 호출되기 전에이 실행될 것입니다. 그것이 당신에게 문제가되는 원인입니다. updateProgressBar()onPrepared 내선으로 이동 한 후 mp.start()

+0

좋아, 그래서 OnErrorListener를 구현하지만 그 methode 안에 무엇을 추가합니까? – Vince

+0

문제는 여전히 지속됩니다. 노래가 끝나면 한 곡 건너 뜁니다. – Vince

+0

좋아, 미디어 플레이어가 지금 재생을 멈추고 오류가 발생하면 오류를 없애고 미디어 플레이어가 노래를 건너 뛰지 않고 다음 노래를 계속 재생할 수 있습니까? – Vince