[MainActivity]

 

public class MainActivity extends Activity implements OnClickListener {
 private Camera myCamera;
 private MyCameraSurfaceView myCameraSurfaceView;
 private MediaRecorder mediaRecorder;

 SurfaceHolder surfaceHolder;
 boolean recording;
 
 Calendar mcalendar;
 int year, month, day;
 int hour, minitues, second;
 String name;
 File mfile;
 String dirPath, mPath;
 LinearLayout myCameraPreview;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  recording = false;
  setContentView(R.layout.activity_main);

  myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
  myCameraPreview = (LinearLayout) findViewById(R.id.videoview);
  myCameraPreview.setOnClickListener(this);
  myCameraPreview.addView(myCameraSurfaceView);

 }

 private Camera getCameraInstance() {
  // TODO Auto-generated method stub
  Camera c = null;
  try {
   c = Camera.open();
   // attempt to get a Camera instance
  } catch (Exception e) {
   // Camera is not available (in use or does not exist)
  }

  return c;
 }

 private boolean prepareMediaRecorder() {
  myCamera = getCameraInstance();
  mediaRecorder = new MediaRecorder();
  myCamera.unlock();
  mediaRecorder.setCamera(myCamera);
  mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
  mediaRecorder.setOutputFile(dirPath+getDate());
  mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface());
  try {
   mediaRecorder.prepare();
  } catch (IllegalStateException e) {
   releaseMediaRecorder();
   return false;
  } catch (IOException e) {
   releaseMediaRecorder();
   return false;
  }
  return true;
 }

 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  super.onResume();
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  //myCamera = getCameraInstance();
  //myCameraSurfaceView.resume();

 }

 private void releaseMediaRecorder() {
  if (mediaRecorder != null) {
   mediaRecorder.reset(); // clear recorder configuration
   mediaRecorder.release(); // release the recorder object
   mediaRecorder = null;
   //myCamera.lock();
   recording = false;
   // lock camera for later use
   
  }
 }

 private void releaseCamera() {
  if (myCamera != null) {
   myCamera.release();
   // release the camera for other applications
   myCamera = null;
  }
 }

}

[MyCameraSurfaceView]

 

public class MyCameraSurfaceView extends SurfaceView implements Callback{
 private SurfaceHolder mHolder;
 private Camera mCamera;

 public MyCameraSurfaceView(Context context, Camera camera) {
  super(context);
  mCamera = camera;
  mHolder = getHolder();    
  mHolder.addCallback(this);   
  // deprecated setting, but required on Android versions prior to 3.0
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  // TODO Auto-generated constructor stub
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  // TODO Auto-generated method stub
   try {        
     mCamera.stopPreview(); 
    } catch (Exception e){
    }
   try {      
     mCamera.setPreviewDisplay(holder);   
     mCamera.startPreview();  
    } catch (Exception e){
   }
 }
  

 

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  try {
    mCamera.setPreviewDisplay(holder); 
    mCamera.startPreview();
   } catch (IOException e) {
  }
 }

 
 @Override
 public void surfaceDestroyed(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
  //mCamera.stopPreview();
  //mCamera = null;
  
 }
 
}

 

카메라로 녹화해서 동영상을 보는 앱을 만들고 있습니다.

 

그런데 녹화하고 동영상을 VideoView로 보고 다시 카메라로 돌아가면 오류가 납니다

 

로그켓에서는 surfaceCreated에서 카메라 프리뷰오류가 나는데 왜그런지 도저히 감이 오질 않습니다;;

 

고수님들 어떻게 해야지 다시 프리뷰 될까요?