안드로이드 개발 질문/답변
(글 수 45,052)
미디어 플레이어 구현중인데요..
미디어 UI 클래스 와 미디어 제어관련 클래스를 따로 만들었는데요..
제어관련 클래스를 Handler 를 상속받아 UI 업데이트하게 구현했는데...
보통 Handler 를 사용하면 sendMessage 를 이용하여 UI 를 업데이트 하는데 전 다른식으로 했거든요..
아래와 같이 사용해도 문제가 없는지 궁금하네요..
꼭 답변부탁드립니다..
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import android.app.Activity; import android.content.Context; import android.media.MediaPlayer; import android.os.Handler; import android.text.Html; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView;
public class MoviePlayerController extends Handler {
private static MediaPlayer mMediaPlayer = null;
private static SurfaceHolder mSurfaceHolder = null;
private static ArrayList<String> mFileList = null;
private String mCurrentFileExt = null;
private int mCurrentFilePos = 0;
private View mRootView = null;
private TextView mFileName = null;
private TextView mTotalTime = null;
private TextView mPlayTime = null;
private TextView mSubtitleText = null;
private TextView mSubtitleText2 = null;
private SeekBar mSeekBar = null;
public MoviePlayerController(Context context, View mRootView) {
mMediaPlayer = new MediaPlayer();
mFileList = new ArrayList<String>();
this.mRootView = mRootView;
setUiThreadItem();
setInitItem();
}
public void setUiThreadItem()
{
mFileName = (TextView)mRootView.findViewById(R.id.MoviePlayer_fileName);
mPlayTime = (TextView)mRootView.findViewById(R.id.MoviePlayer_PlayTime);
mTotalTime = (TextView)mRootView.findViewById(R.id.MoviePlayer_TotalTime);
mSeekBar = (SeekBar)mRootView.findViewById(R.id.MoviePlayer_Progress);
mSubtitleText = (TextView)mRootView.findViewById(R.id.MoviePlayer_Subtitle);
mSubtitleText2 = (TextView)mRootView.findViewById(R.id.MoviePlayer_Subtitle2);
}
public void setInitItem()
{
mPlayTime.setText("00:00:00");
mTotalTime.setText("00:00:00");
mSeekBar.setProgress(0);
mSeekBar.setSecondaryProgress(0);
}
public void setSurfaceHolder(SurfaceHolder sh)
{
mSurfaceHolder = sh;
}
public String getCurrentFilePath()
{
return mFileList.get(mCurrentFilePos);
}
public void InitMoviePlayer()
{
if(mMediaPlayer == null)
{
mMediaPlayer = new MediaPlayer();
}
try{
mMediaPlayer.reset();
mMediaPlayer.setDataSource(mFileList.get(mCurrentFilePos));
mMediaPlayer.setDisplay(mSurfaceHolder);
mMediaPlayer.setOnErrorListener(MediaErrorListener);
mMediaPlayer.setOnCompletionListener(MediaCompletionListener);
mMediaPlayer.setOnBufferingUpdateListener(MediaBufferingListener);
mMediaPlayer.setOnPreparedListener(MediaPreparedListener);
mMediaPlayer.setOnSeekCompleteListener(MediaSeekCompletionListener);
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void MoviePrePare()
{
try {
if(mMediaPlayer != null)
{
mMediaPlayer.prepare();
}
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void MoviePrePareAsync()
{
mMediaPlayer.prepareAsync();
}
public void setProgressData()
{
mSeekBar.setMax((int)getMovieDuration());
}
public String getCurrentFileName()
{
String FilePath = null;
String FileName = null;
FilePath = mFileList.get(mCurrentFilePos);
FileName = FilePath.substring(FilePath.lastIndexOf("/")+1,FilePath.length());
return FileName;
}
public void addFilePathList(String path)
{
mFileList.add(path);
}
public long getMovieDuration() {
long duration = 0;
if(mMediaPlayer != null)
{
duration = mMediaPlayer.getDuration();
}
return duration;
}
public long getMoviePosition() {
long pos = 0;
if(mMediaPlayer != null)
{
pos = mMediaPlayer.getCurrentPosition();
}
return pos;
}
public long setMovieSeek(long whereto) {
if(mMediaPlayer != null)
{
mMediaPlayer.seekTo((int) whereto);
}
return getMoviePosition();
}
public void setMovieVolume(float vol) {
if(mMediaPlayer != null)
{
mMediaPlayer.setVolume(vol, vol);
}
}
public void MovieStart() {
if(mMediaPlayer == null)
{
InitMoviePlayer();
MoviePrePare();
StartSmi();
return;
}
if(mMediaPlayer != null)
{
if(MovieisPlaying())
{
StartSmi();
return;
}
mFileName.setText(getCurrentFileName());
mTotalTime.setText(Util.millisec2Time(mMediaPlayer.getDuration()));
try{
mMediaPlayer.start();
setProgressData();
startPlayProgressUpdater();
StartSmi();
}
catch (IllegalStateException e) {
// TODO: handle exception
}
catch (IllegalArgumentException e) {
// TODO: handle exception
}
}
}
public void MoviePause() {
if(mMediaPlayer != null)
{
mMediaPlayer.pause();
}
}
public void MovieStop() {
if(mMediaPlayer != null)
{
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
clearSmiData();
setInitItem();
}
}
public boolean MovieisPlaying() {
if(mMediaPlayer != null)
{
return mMediaPlayer.isPlaying();
}
return false;
}
public void MovieRewind()
{
}
public void MovieFoward()
{
}
public void MoviePrevious()
{
mCurrentFilePos--;
if(mCurrentFilePos < 0)
mCurrentFilePos = 0;
if(mMediaPlayer != null)
{
if(MovieisPlaying())
{
MovieStop();
InitMoviePlayer();
MoviePrePare();
}
else
{
InitMoviePlayer();
MoviePrePare();
}
}
else
{
InitMoviePlayer();
MoviePrePare();
}
}
public void MovieNext()
{
mCurrentFilePos++;
LoggerA.d(LOG_TAG, "size : " + mFileList.size() + " pos : " + mCurrentFilePos);
if(mCurrentFilePos < mFileList.size())
{
if(mMediaPlayer != null)
{
if(MovieisPlaying())
{
MovieStop();
InitMoviePlayer();
MoviePrePare();
}
else
{
InitMoviePlayer();
MoviePrePare();
}
}
else
{
InitMoviePlayer();
MoviePrePare();
}
}
else
{
mCurrentFilePos--;
MovieStop();
InitMoviePlayer();
MoviePrePare();
}
}
public void MovieBtnList()
{
}
private int getMediaType(String Path)
{
String Ext = Util.getFileExtention(Path);
if(Ext != null)
{
if(Ext.equalsIgnoreCase("ts"))
{
return MEDIA_TS;
}
else
{
return MEDIA_LOCAL_VIDEO;
}
}
return MEDIA_EMPTY;
}
public void startPlayProgressUpdater() {
mSeekBar.setProgress((int)getMoviePosition());
mPlayTime.setText(Util.millisec2Time((int)getMoviePosition()));
if (mMediaPlayer != null) {
if(MovieisPlaying())
{
Runnable notification = new Runnable() {
public void run() {
startPlayProgressUpdater();
}
};
postDelayed(notification,1000);
}
else
{
MoviePause();
}
}
}
/*****************************************************
*
* 리스너 등록
*
*****************************************************/
// 재생완료시
MediaPlayer.OnCompletionListener MediaCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
LoggerA.d(LOG_TAG, "onCompletion");
if(mMediaPlayer != null)
{
MovieNext();
}
}
};
// SeekTo 호출후 동기화를 위해
MediaPlayer.OnSeekCompleteListener MediaSeekCompletionListener = new MediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
// TODO Auto-generated method stub
LoggerA.d(LOG_TAG, "onSeekComplete");
}
};
// 스트리밍을 위한
MediaPlayer.OnBufferingUpdateListener MediaBufferingListener = new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// TODO Auto-generated method stub
LoggerA.d(LOG_TAG, "onBufferingUpdate");
}
};
// 에러처리 리스너
MediaPlayer.OnErrorListener MediaErrorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// TODO Auto-generated method stub
LoggerA.d(LOG_TAG, "onError");
return false;
}
};
// Prepared 를 위한 리스너
MediaPlayer.OnPreparedListener MediaPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
LoggerA.d(LOG_TAG, "onPrepared");
MovieStart();
}
};
}




이것만 봤을때는 에러 날거 같은데요
Handler를 상속받아서 구현했다고 되는게 아니라 sendMessage를 호출 하면
자동으로 handleMessage가 불려지고
handleMessage << 이부분에서 UI를 처리 해야 하지 않나요?
그 부분이 아닌거 같아서...