title: Getting a Camera error 100 and a Method called after release error
body: <p>I'm playing with the google tutorial on using video recorders but I can't get it to work anyhow. I first keep getting at Method called after release error, for the camera preview which I tracked down to realize that mCamera.stoppreview() doesn't work before the startpreview is called again onSurfaceChanged(). Also I get a Camera 100 error with mediaserver died, camera server died and  icamera died when MediaRecorder.start() is called. I can't seem to figure out why.</p>
  
  <p>Here is my CameraActivity code</p>
  
  <pre><code>public class MainActivity extends Activity {
       private Camera mCamera;
       private MediaRecorder mMediaRecorder;
       private CameraPreview mPreview;
       private static final String TAG = "Message";
       public static final int MEDIA_TYPE_IMAGE = 1;
       public static final int MEDIA_TYPE_VIDEO = 2;
       private boolean isRecording = false;
       Button captureButton;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
              setContentView(R.layout.preview);
              System.out.println("Going to get the camera");
  
  
              mCamera = getCameraInstance();
              //mMediaRecorder = new MediaRecorder();
              mPreview = new CameraPreview(this, mCamera);
  
              FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
  
              preview.addView(mPreview);
            //  setPreviewCallback(null);
  
             captureButton = (Button) findViewById(R.id.button_capture);
              captureButton.setOnClickListener(
                  new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
  
                           if (isRecording) {
                                  // stop recording and release camera
                                  mMediaRecorder.stop();  // stop the recording
                                  releaseMediaRecorder(); // release the MediaRecorder object
                                  mCamera.lock();         // take camera access back from MediaRecorder
  
                                  // inform the user that recording has stopped
                                  captureButton.setText("Capture");
                                  isRecording = false;
                              } else {
                                  // initialize video camera
                                  releaseCamera();
  
                                  if (prepareVideoRecorder()) {
                                      System.out.println("Starting to record");
                                      // Camera is available and unlocked, MediaRecorder is prepared,
                                      // now you can start recording
                                      mMediaRecorder.start();
  
                                      // inform the user that recording has started
                                      captureButton.setText("Stop");
                                      isRecording = true;
                                  } else {
                                      // prepare didn't work, release the camera
                                      System.out.println("Recording failed");
                                      releaseMediaRecorder();
                                      // inform user
                                  }
                              }
                          }
  
                  }
              );
      }
      public static Camera getCameraInstance(){
          Camera c = null;
          try {
              c = Camera.open();
              System.out.println("This is the camera "+c);// attempt to get a Camera instance
          }
          catch (Exception e){
              // Camera is not available (in use or does not exist)
              System.out.println("Didn't get the camera ");
          }
          return c; // returns null if camera is unavailable
      }
  
      private boolean prepareVideoRecorder(){
          mCamera = getCameraInstance();
          mMediaRecorder = new MediaRecorder();
          /*CameraPreview preview;
          preview=new CameraPreview(this, mCamera);*/
          // Step 1: Unlock and set camera to MediaRecorder
          mCamera.unlock();
          mMediaRecorder.setCamera(mCamera);
  
          // Step 2: Set sources
          mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
          mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  
          // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
          mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
  
          // Step 4: Set output file
          mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
  
          // Step 5: Set the preview output
          System.out.println("About to preview");
          mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
          System.out.println("Preview worked");
          // Step 6: Prepare configured MediaRecorder
          try {
              mMediaRecorder.prepare();
          } catch (IllegalStateException e) {
              Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
              releaseMediaRecorder();
              return false;
          } catch (IOException e) {
              Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
              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 (mMediaRecorder != null) {
              mMediaRecorder.reset();   // clear recorder configuration
              mMediaRecorder.release(); // release the recorder object
              mMediaRecorder = null;
              mCamera.lock();           // lock camera for later use
          }
      }
  
      private void releaseCamera(){
          if (mCamera != null){
              mCamera.stopPreview();
              mCamera.setPreviewCallback(null);
              mCamera.release();        // release the camera for other applications
              mCamera = null;
          }
      }
  
      private PictureCallback mPicture = new PictureCallback() {
  
          @Override
          public void onPictureTaken(byte[] data, Camera camera) {
              System.out.println("Picture received");
              File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
              if (pictureFile == null){
                  Log.d(TAG, "Error creating media file, check storage permissions: ");
                  return;
              }
  
              try {
                  System.out.println("Saving");
                  FileOutputStream fos = new FileOutputStream(pictureFile);
                  fos.write(data);
                  fos.close();
              } catch (FileNotFoundException e) {
                  Log.d(TAG, "File not found: " + e.getMessage());
              } catch (IOException e) {
                  Log.d(TAG, "Error accessing file: " + e.getMessage());
              }
          }
      };
  
  
  
      /** Create a File for saving an image or video */
      /** Create a File for saving an image or video */
      private static File getOutputMediaFile(int type){
          // To be safe, you should check that the SDCard is mounted
          // using Environment.getExternalStorageState() before doing this.
          System.out.println("Trying to save picture");
          File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), "MyCameraApp");
          // This location works best if you want the created images to be shared
          // between applications and persist after your app has been uninstalled.
  
          // Create the storage directory if it does not exist
          if (! mediaStorageDir.exists()){
              if (! mediaStorageDir.mkdirs()){
                  Log.d("MyCameraApp", "failed to create directory");
                  return null;
              }
          }
  
          // Create a media file name
          String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
          File mediaFile;
          if (type == MEDIA_TYPE_IMAGE){
              mediaFile = new File(mediaStorageDir.getPath() + File.separator +
              "IMG_"+ timeStamp + ".jpg");
          } else if(type == MEDIA_TYPE_VIDEO) {
              mediaFile = new File(mediaStorageDir.getPath() + File.separator +
              "VID_"+ timeStamp + ".mp4");
          } else {
              return null;
          }
  
          return mediaFile;
      }
  }
  </code></pre>
  
  <p>and this is my CameraPreview class</p>
  
  <pre><code>public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
      private static final String TAG = "Message";
      private SurfaceHolder mHolder;
      private Camera mCamera;
  
      public CameraPreview(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);
      }
  
      public void surfaceCreated(SurfaceHolder holder) {
          // The Surface has been created, now tell the camera where to draw the preview.
          try {
              mCamera.setPreviewDisplay(holder);
              mCamera.startPreview();
          } catch (IOException e) {
              Log.d(TAG, "Error setting camera preview: " + e.getMessage());
          }
      }
  
      public void surfaceDestroyed(SurfaceHolder holder) {
          // empty. Take care of releasing the Camera preview in your activity.
          /*mCamera.setPreviewCallback(null);
          mCamera.stopPreview();
          mCamera.release();*/
      }
  
      public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
          // 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
              System.out.println("Stop preview didn't work ");
  
  
          }
  
          // set preview size and make any resize, rotate or
          // reformatting changes here
  
          // start preview with new settings
          try {
              mCamera.setPreviewDisplay(mHolder);
              mCamera.startPreview();
  
          } catch (Exception e){
              Log.d(TAG, "Error starting camera preview: " + e.getMessage());
          }
      }
  }
  </code></pre>
  
  <p>EDIT:
  XML Layout</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      &gt;
    &lt;FrameLayout
      android:id="@+id/camera_preview"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_weight="1"
      /&gt;
  
    &lt;Button
      android:id="@+id/button_capture"
      android:text="Capture"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      /&gt;
  &lt;/LinearLayout&gt;
  </code></pre>