마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

음악 재생바 관련 질문입니다.

0 추천

안녕하세요.

음악을 재생시키고 현재 위치에 따른 재생바를 변경하려고 쓰레드 또는 핸들러를 사용해서 하는데 둘다 음악의 재생이 정상적으로 되지 않습니다. 삑하는 소리가 나거나 음악이 중간 중간을 건너 뛰며 재생하는 현상이 발생합니다.

   //play 진행 변경
        seek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
 
            }
 
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
 
            }
 
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                // TODO Auto-generated method stub
                  if (mPlayer[str] != null) {
                  mPlayer[str].seekTo(progress);// 이놈이 문제 같네요.. 다시 알아보니...이놈을 주석처리하면 정상 동작하는데..
원하는 위치로 변경이 제대로 안되는 거같네요..
                 } else {
                  Toast.makeText(ActivityMainPlay.this,
                    "PLAY한 상태에서 시간을 조정할 수 있습니다.", Toast.LENGTH_SHORT)
                  .show();
                   }
            }
        });
 

 

 

- 핸들러 사용

Handler mseekPlayHandler = new Handler(){

public void handleMessage(Message msg){
if(mPlayer[str]==null)return;
if(mPlayer[str].isPlaying())
{
seek.setProgress(mPlayer[str].getCurrentPosition());
}
mseekPlayHandler.sendEmptyMessageDelayed(0, 1000);
}
};
 
- 쓰레드 사용시 
class MyThread implements Runnable {
int maxTime = mPlayer.getDuration();
int braekTime = 0;
 
public void run() {
// TODO Auto-generated method stub
while (braekTime == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
if (mPlayer == null) {
braekTime = 1; //
// seek.setProgress(1);
} else {
int aaa = mPlayer.getCurrentPosition();
Log.d("aaa", Integer.toString(aaa));
seekPlay.setProgress(mPlayer.getCurrentPosition());
}
}
}
}
 
음.. 문제가 무엇일까요? 조언 부탁드립니다.

 

익명사용자 님이 2013년 9월 9일 질문
2013년 9월 9일 수정

2개의 답변

0 추천
생각해 봅시다.

음악이 재생됩니다.

그러면 핸들러에 의해서 프로그레스 바의 값이 변경됩니다.

프로그레스 바의 값이 변경되면 리스너에 의해서 미디어 플레이어의 현재 재생 위치를 변경합니다.

 

이렇게 이벤트가 2번씩 중복해서 일어나니 재생이 매끄럽지 않겠죠.

 

onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)

프로그레스 바의 값이 변경되면 해당 메소드가 호출 되는데

이때 마지막 파라미터의 값으로 사용자가 직접 음악의 재생 위치를 변경한 것인지

단순히 음악 재생에 따른 프로그레스 바 값의 변경인지 구분하여

미디어 플레이어의 seekTo 메소드를 사용하거나 사용하지 않으시면 됩니다.
원조안드로이드 (58,190 포인트) 님이 2013년 9월 9일 답변
0 추천
제 경우를 참고로 말씀 드립니다.

MediaPlayer객체가 아닌 AudioTrack을 객체로 써서 직접 하위 구조까지 컨트롤하다 보니 이래저래 할것이 많은데요.

화면에 표시되는 씩바가 백그라운드로 깔리고 바로 위에 사용자가 직접 터치해서 반영되는 씩바. 이렇게 2가지의 씩바로 컨트롤 합니다.
mOn (570 포인트) 님이 2013년 9월 10일 답변
...