package geeks.VideoRecord;


import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.MediaController;
import android.widget.VideoView;
public class VideoRecord extends Activity implements SurfaceHolder.Callback {
 /** Called when the activity is first created. */
 private MediaRecorder recorder = null;
 private static final String OUTPUT_FILE = "/sdcard/videooutput.mp4";
 private static final String TAG = "RecordVideo";
 private VideoView videoView = null;
 private Button startButton = null;
 private Camera mCamera;
 private SurfaceView preView;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.videorecorder);
  startButton = (Button) findViewById(R.id.record);
  final Button stopButton = (Button) findViewById(R.id.stop);
  final Button playButton = (Button) findViewById(R.id.play);
  final Button stopPlayButton = (Button) findViewById(R.id.play_stop);
  // final SurfaceView surface = new SurfaceView(getApplicationContext());
  preView = (SurfaceView) findViewById(R.id.preview);
  videoView = (VideoView) this.findViewById(R.id.videoView);
  // final SurfaceHolder surfaceHolder = surface.getHolder();
  // surfaceHolder.addCallback(this);
  // surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  final SurfaceHolder preViewHolder = preView.getHolder();
  preViewHolder.addCallback(this);
  preViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  // final SurfaceHolder holder = videoView.getHolder();
  // holder.addCallback(this);
  // holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  // FrameLayout frame = (FrameLayout) findViewById(R.id.frame);
  // frame.addView(surface);
  startButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    try {
     // startRecording(surfaceHolder);
     startRecording(preViewHolder);
     stopButton.setVisibility(v.VISIBLE);
     startButton.setVisibility(v.GONE);
    } catch (Exception e) {
     // TODO Auto-generated catch block
     Log.e(TAG, e.toString());
     e.printStackTrace();
    }
   }
  });
  stopButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    try {
     stopRecording();
    } catch (Exception e) {
     // TODO Auto-generated catch block
     Log.e(TAG, e.toString());
     e.printStackTrace();
    }
    stopButton.setVisibility(v.GONE);
    startButton.setVisibility(v.VISIBLE);
    preView.setVisibility(v.GONE);
   }
  });
  playButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    try {
     playVideo();
    } catch (Exception e) {
     Log.e(TAG, e.toString());
    }
    stopPlayButton.setVisibility(v.VISIBLE);
    videoView.setVisibility(v.VISIBLE);
    playButton.setVisibility(v.GONE);
   }
  });
  stopPlayButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    try {
     stopVideo();
    } catch (Exception e) {
     Log.e(TAG, e.toString());
    }
    playButton.setVisibility(v.VISIBLE);
    stopPlayButton.setVisibility(v.GONE);
    videoView.setVisibility(v.GONE);
    preView.setVisibility(v.VISIBLE);
   }
  });
 }
 protected void stopVideo() {
  // TODO Auto-generated method stub
  videoView.stopPlayback();
 }
 protected void playVideo() {
  // TODO Auto-generated method stub
  MediaController mc = new MediaController(this);
  videoView.setMediaController(mc);
  videoView.setVideoPath(OUTPUT_FILE);
  videoView.start();
 }
 protected void stopRecording() throws Exception {
  // TODO Auto-generated method stub
  if (recorder != null) {
   recorder.stop();
   recorder.reset();
   recorder.release();
  }
 }
 /**
  * 녹화를 시작한다.
  *
  * @param holder
  *            카메라
  * @throws Exception
  */
 protected void startRecording(SurfaceHolder holder) throws Exception {
  // TODO Auto-generated method stub
  if (recorder != null) {
   recorder.stop();
   recorder.release();
  }
  File outFile = new File(OUTPUT_FILE);
  if (outFile.exists()) {
   outFile.delete();
  }
  recorder = new MediaRecorder();
  recorder.reset();
  recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  recorder.setVideoSize(300, 200);
  recorder.setVideoFrameRate(15);
  recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  recorder.setMaxDuration(20000);// 우선 20초
  // recorder.setPreviewDisplay(holder.getSurface());
  recorder.setOutputFile(OUTPUT_FILE);
  try {
   recorder.prepare();
   recorder.start();
  } catch (Exception e) {
   // TODO: handle exception
   Log.e(TAG, e.toString());
   e.printStackTrace();
  }
 }
 @Override
 protected void onDestroy() {
  super.onDestroy();
  if (recorder != null) {
   recorder.release();
  }
 }
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
  // TODO Auto-generated method stub
  Log.d(TAG, "Enter surfaceChanged  ---------------------------");
  Camera.Parameters parameters = mCamera.getParameters();
  mCamera.setParameters(parameters);
  mCamera.startPreview();
 }
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  mCamera = Camera.open();
//  startButton.setEnabled(true);
  try {
   mCamera.setPreviewDisplay(holder);
  } catch (IOException exception) {
   mCamera.release();
   mCamera = null;
   // TODO: add more exception handling logic here
  }
 }
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  mCamera.stopPreview();
  mCamera.release();
  mCamera = null;
 }
}


recoder.prepare에서 예외처리가 되네요
기본 화면에서 프리뷰는 잘 뜨고 있는데