Search code examples
androidorientationvideo-capture

How I can have previewing permanently when capture video for android?


I am writing a video capture app for android. I have preview first time I want to capture. But after I press stop, I no longer get preview when I start recording again. How can I have preview option permanently?

protected void startRecording() throws IOException 
{
String state = android.os.Environment.getExternalStorageState();
if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) 
{
    throw new IOException("SD Card is not mounted.  It is " + state + ".");
}

// make sure the directory we plan to store the recording in exists
File directory = new File(this.Videopath).getParentFile();

if (!directory.exists() && !directory.mkdirs()) 
{
    throw new IOException("Path to file could not be created.");
}

 mCamera.stopPreview();
 mCamera.unlock();
 mrec = new MediaRecorder();  // Works well
 mrec.setCamera(mCamera);   
 mrec.setAudioSource(MediaRecorder.AudioSource.MIC);
 mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
 mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
 mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
 mrec.setOutputFile(Videopath);
 mrec.setPreviewDisplay(surfaceHolder.getSurface());   
 mrec.prepare();
 isRecording=true;
 mrec.start();
}
//-------------------------------------------------------------
protected void stopRecording() 
{
    if(mrec !=null)
        mrec.stop();
    releaseMediaRecorder();
    isRecording=false;
}
//-------------------------------------------------------------
private void releaseMediaRecorder()
{
    if (mrec != null) 
    {
        mrec.reset();   // clear recorder configuration
        mrec.release(); // release the recorder object
        mrec = null;
        mCamera.lock();           // lock camera for later use
    }
}
//-------------------------------------------------------------
private void releaseCamera()
{
    if (mCamera != null)
    {
        mCamera.release();        // release the camera for other applications
        mCamera = null;
    }
}
//-------------------------------------------------------------
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) 
{
     try {
            mCamera .setPreviewDisplay(holder);
        } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       mCamera .startPreview();  
}
 //-------------------------------------------------------------
@Override
public void surfaceCreated(SurfaceHolder holder) 
{
    if (mCamera != null)
       {
          Parameters params = mCamera.getParameters();
          mCamera.setParameters(params);
          mCamera.setDisplayOrientation(90);
          try {
            mCamera .setPreviewDisplay(holder);
        } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          mCamera .startPreview();

       }
       else
       {
          Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show();
         VideoRecorderActivity.this.finish();
       }


}
 //-------------------------------------------------------------
@Override
public void surfaceDestroyed(SurfaceHolder holder) 
{


}

Solution

  • After you press stop recording either you can play the recorded video or if you want to restart your preview then in your stoprecording method do this:

     protected void stopRecording() 
    {
    if(mrec !=null)
     try{
         mrec.stop();
    
        }catch(IllegalStateException e)
        {
       Log.e(TAG,"Got illegal ");
    
       }
     releaseRecorder();
     releaseCamera();
     isRecording=false;
    
     /*Here do the same process which you do while creating the preview i.e initilize the camera and create the preview */
    
      mCamera = Camera.open();
      camera.lock();    
      surfaceHolder = surfaceView.getHolder();
      surfaceHolder.addCallback(this); 
     try{
                    mCamera .setPreviewDisplay(holder);
                    mCamera .startPreview();
            }catch(IOException e)
            {
                    Log.v(TAG,"could not start the preview ");
                    e.printStackTrace();
    
            }            
    
    }
    
    // release the recorder after recording
        private void releaseRecorder() {
                if( mrec!=null){
                 Log.v(TAG, "recorder released");
                   mrec.release();
                   mrec=null;
                }
    
        }
        // release the camera after recording
        private void releaseCamera() {
                if(mcamera!=null){
                        try{
                                mcamera.reconnect();
    
                        }catch(IOException e){
                                e.printStackTrace();
                        }
                        Log.v(TAG, "camera released");
                        mcamera.release();
                        mcamera=null;
                }