Vijay Laxmi
Vijay Laxmi

Reputation: 175

Unable to open the front camera to record in Android

I am trying to use the front camera to record. My code is working fine with the back camera.

The problem is in getFrontCameraId() and getCameraInstance()

Here is my code..

public class AndroidVideoCapture extends Activity{

private Camera myCamera;
  private MyCameraSurfaceView myCameraSurfaceView;
  private MediaRecorder mediaRecorder;

Button myButton;
SurfaceHolder surfaceHolder;
boolean recording;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      recording = false;

      setContentView(R.layout.activity_android_video_capture);

      //Get Camera for preview
      myCamera = getCameraInstance();
      if(myCamera == null){
       Toast.makeText(AndroidVideoCapture.this,
         "Fail to get Camera",
         Toast.LENGTH_LONG).show();
      }

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

      myButton = (Button)findViewById(R.id.mybutton);
      myButton.setOnClickListener(myButtonOnClickListener);
  }

  Button.OnClickListener myButtonOnClickListener
  = new Button.OnClickListener(){

@Override
public void onClick(View v) {
 // TODO Auto-generated method stub
 if(recording){
              // stop recording and release camera
              mediaRecorder.stop();  // stop the recording
              releaseMediaRecorder(); // release the MediaRecorder object

              //Exit after saved
              finish();
 }else{

  //Release Camera before MediaRecorder start
  releaseCamera();

        if(!prepareMediaRecorder()){
         Toast.makeText(AndroidVideoCapture.this,
           "Fail in prepareMediaRecorder()!\n - Ended -",
           Toast.LENGTH_LONG).show();
         finish();
        }

  mediaRecorder.start();
  recording = true;
  myButton.setText("STOP");
 }
}};
public int getFrontCameraId() {
    CameraInfo ci = new CameraInfo();
    for (int i = 0 ; i < Camera.getNumberOfCameras(); i++) {
        Camera.getCameraInfo(i, ci);
        if (ci.facing == CameraInfo.CAMERA_FACING_FRONT) return i;
    }

    return -1; // No front-facing camera found
}
  private Camera getCameraInstance(){
// TODO Auto-generated method stub
      Camera c = null;
      try {
          int index = getFrontCameraId();
          if (index == -1)
           c = Camera.open(index);
       //   c = Camera.open(); // attempt to get a Camera instance
      }
      catch (Exception e){
          // Camera is not available (in use or does not exist)
      }
      return c; // returns null if camera is unavailable
}

private boolean prepareMediaRecorder(){
   myCamera = getCameraInstance();
   mediaRecorder = new MediaRecorder();

   myCamera.unlock();
   mediaRecorder.setCamera(myCamera);

   mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
   mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

   mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

   mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
      mediaRecorder.setMaxDuration(60000); // Set max duration 60 sec.
      mediaRecorder.setMaxFileSize(5000000); // Set max file size 5M

   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 onPause() {
      super.onPause();
      releaseMediaRecorder();       // if you are using MediaRecorder, release it first
      releaseCamera();              // release the camera immediately on pause event
  }

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

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

public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{

private SurfaceHolder mHolder;
   private Camera mCamera;

public MyCameraSurfaceView(Context context, Camera camera) {
       super(context);
       mCamera = camera;

       // Install a SurfaceHolder.Callback so we get notified when the
       // underlying surface is created and destroyed.
       mHolder = getHolder();
       mHolder.addCallback(this);
       // deprecated setting, but required on Android versions prior to 3.0
       mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
   }

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int weight,
  int height) {
       // If your preview can change or rotate, take care of those events here.
       // Make sure to stop the preview before resizing or reformatting it.

       if (mHolder.getSurface() == null){
         // preview surface does not exist
         return;
       }

       // stop preview before making changes
       try {
           mCamera.stopPreview();
       } catch (Exception e){
         // ignore: tried to stop a non-existent preview
       }

       // make any resize, rotate or reformatting changes here

       // start preview with new settings
       try {
           mCamera.setPreviewDisplay(mHolder);
           mCamera.startPreview();

       } catch (Exception e){
       }
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
 // TODO Auto-generated method stub
 // The Surface has been created, now tell the camera where to draw the preview.
       try {
           mCamera.setPreviewDisplay(holder);
           mCamera.startPreview();
       } catch (IOException e) {
       }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
 // TODO Auto-generated method stub

}
}
}

Upvotes: 0

Views: 1445

Answers (1)

user948620
user948620

Reputation:

You have a wrong condition in your module

private Camera getCameraInstance() {

// TODO Auto-generated method stub
      Camera c = null;
      try {
          int index = getFrontCameraId();
          if (index == -1)
           c = Camera.open(index);
       //   c = Camera.open(); // attempt to get a Camera instance
      }
      catch (Exception e){
          // Camera is not available (in use or does not exist)
      }
      return c; // returns null if camera is unavailable
}

It should be

private Camera getCameraInstance() {

// TODO Auto-generated method stub
      Camera c = null;
      try {
          int index = getFrontCameraId();
          if (index != -1)
           c = Camera.open(index);

      }
      catch (Exception e){
          // Camera is not available (in use or does not exist)
      }
      return c; // returns null if camera is unavailable
}

Upvotes: 1

Related Questions