비디오 뷰를 대신할 걸 만드는 중입니다.
현재는 밑의 현재 재생시간/시크바/동영상 길이 부분을 구현하고 있는데요,
동영상 길이는 미디어 플레이어.getDuration()으로 해결 했고,
문제는 재생 시간 부분인데, 스레드를 만들어서 1초에 한번씩 getCurrentPosition()으로 텍스트뷰를 갱신하게 했습니다.
그런데 빌드해보니 오류가 나네요.
new Thread() {
// @Override
public void run() {
try {
for (int i = 0; i < 20;) {
sleep(1000);
handler.sendMessage(new Message()); }
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();이게 스레드 부분이구요.
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
int MS = mPlayer.getCurrentPosition();
String Time = getHMSTime(MS);
NowTime = (TextView) findViewById(R.id.textViewperc);
NowTime.setText(Time);
super.handleMessage(msg);
}
}이게 핸들러 부분입니다. getHMSTime()메서드는 밀리세컨드를 시 : 분 : 초 문자열로 바꿔주는 메서드구요.
갱신해야 할 텍스트뷰가 NowTime입니다.
오류는 영상 플레이 도중, 취소 키를 눌렀을때 발생하구요...
로그캣에 이렇게 나왔습니다.
02-11 16:26:00.281: E/AndroidRuntime(13364): at net.jbong.FFmpegBasic.VideoNew$MyHandler.handleMessage(VideoNew.java:210)
210라인은 int MS = mPlayer.getCurrentPosition(); 입니다.
어떻게 해결해야 할지 도저히 모르겠네요.
onBackPressed(), onDestory() 등, 액티비티 설계에 따라서 필요한 곳을 오버라이드해서
스레드 종료, 핸들러 종료, mPlayer.stop(); mPlayer.release(); 등을 호출해주시면 어떨까요.
mPlayer.setOnCompletionListener(); 사용하시면, 재생이 완료되었을 때
public void onCompletion(MediaPlayer mp) 가 호출됩니다.
해당 함수 안에서 필요한 과정 수행하시면 되요.
setOnCompletionListener() 외에도 이벤트 리스너 더 있으니 레퍼런스를 참고하세요.
http://developer.android.com/reference/android/media/MediaPlayer.html




볼때 취소키를 누르면 mPlayer가 종료되게 했는데, 이러니 커런트 포지션을 구할수가 없게 되어서 같습니다.
그런데 어떻게 해결해야 할지는 그래도 막막합니다;;
생각나는건 mPlayer가 종료될때 리스너를 달아서 스레드나 핸들러가 종료되게 하면 될 것 같은데,
mPlayer가 종료될때의 리스너도, 핸들러나 스레드를 종료하게 하는 방법도 모르겠네요ㅜㅜ