title: android.hardware.Camera.setParameters getting runTime Exception(android)
body: <p>I'm working on a project which has some camera functionalities. I have been facing a problem related to surface view. At first I implemented according to this article: <a href="http://examples.javacodegeeks.com/android/core/ui/surfaceview/android-surfaceview-example/" rel="nofollow noreferrer">Android SurfaceView Example</a>. But this had some drawbacks: it captured the image in a stretched aspect ratio. I created a CustomView which Implemented <code>SurfaceHolder.Callback</code> to calculate the width and Height of the hosting view with <code>mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();</code> But now <code>android.hardware.Camera.setParameters</code> got me<br>
   <a href="https://i.stack.imgur.com/K2kxB.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/K2kxB.png" alt="enter image description here"></a></p>
  
  <pre><code>    public class Preview extends ViewGroup implements SurfaceHolder.Callback {
      private final String TAG = "Preview";
  
      SurfaceView mSurfaceView;
      SurfaceHolder mHolder;
      Size mPreviewSize;
      List&lt;Size&gt; mSupportedPreviewSizes;
      Camera mCamera;
  
      Context activecontext;
      private int cameraId = 1;
  
      Preview(Context context, SurfaceView sv) {
          super(context);
  
          activecontext = context;
  
          mSurfaceView = sv;
  //        addView(mSurfaceView);
  
          mHolder = mSurfaceView.getHolder();
          mHolder.addCallback(this);
          mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      }
  
      public void setCamera(Camera camera) {
          mCamera = camera;
          if (mCamera != null) {
              mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
              requestLayout();
  
              // get Camera parameters
              Camera.Parameters params = mCamera.getParameters();
  
              List&lt;String&gt; focusModes = params.getSupportedFocusModes();
              if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
                  // set the focus mode
                  params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
                  // set Camera parameters
                  mCamera.setParameters(params);
              }
          }
      }
  
      @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          // We purposely disregard child measurements because act as a
          // wrapper to a SurfaceView that centers the camera preview instead
          // of stretching it.
          final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
          final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
          setMeasuredDimension(width, height);
  
          if (mSupportedPreviewSizes != null) {
              mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
          }
      }
  
      @Override
      protected void onLayout(boolean changed, int l, int t, int r, int b) {
          if (changed &amp;&amp; getChildCount() &gt; 0) {
              final View child = getChildAt(0);
  
              final int width = r - l;
              final int height = b - t;
  
              int previewWidth = width;
              int previewHeight = height;
              if (mPreviewSize != null) {
                  previewWidth = mPreviewSize.width;
                  previewHeight = mPreviewSize.height;
              }
  
              // Center the child SurfaceView within the parent.
              if (width * previewHeight &gt; height * previewWidth) {
                  final int scaledChildWidth = previewWidth * height / previewHeight;
                  child.layout((width - scaledChildWidth) / 2, 0,
                          (width + scaledChildWidth) / 2, height);
              } else {
                  final int scaledChildHeight = previewHeight * width / previewWidth;
                  child.layout(0, (height - scaledChildHeight) / 2,
                          width, (height + scaledChildHeight) / 2);
              }
          }
      }
  
      public void surfaceCreated(SurfaceHolder holder) {
          // The Surface has been created, acquire the camera and tell it where
          // to draw.
          try {
              if (mCamera != null) {
                  mCamera.setPreviewDisplay(holder);
              }
          } catch (IOException exception) {
              Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
          }
      }
  
      public void surfaceDestroyed(SurfaceHolder holder) {
          // Surface will be destroyed when we return, so stop the preview.
          if (mCamera != null) {
              mCamera.stopPreview();
          }
      }
  
  
      private Size getOptimalPreviewSize(List&lt;Size&gt; sizes, int w, int h) {
          final double ASPECT_TOLERANCE = 0.1;
          double targetRatio = (double) w / h;
          if (sizes == null) return null;
  
          Size optimalSize = null;
          double minDiff = Double.MAX_VALUE;
  
          int targetHeight = h;
  
          // Try to find an size match aspect ratio and size
          for (Size size : sizes) {
              double ratio = (double) size.width / size.height;
              if (Math.abs(ratio - targetRatio) &gt; ASPECT_TOLERANCE) continue;
              if (Math.abs(size.height - targetHeight) &lt; minDiff) {
                  optimalSize = size;
                  minDiff = Math.abs(size.height - targetHeight);
              }
          }
  
          // Cannot find the one match the aspect ratio, ignore the requirement
          if (optimalSize == null) {
              minDiff = Double.MAX_VALUE;
              for (Size size : sizes) {
                  if (Math.abs(size.height - targetHeight) &lt; minDiff) {
                      optimalSize = size;
                      minDiff = Math.abs(size.height - targetHeight);
                  }
              }
          }
          Log.d(TAG,"cameraPreviewWidth:"+optimalSize.width+" cameraPreviewHeight:"+optimalSize.height);
          return optimalSize;
      }
  
      public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
          if(mCamera != null) {
              Camera.Parameters parameters = mCamera.getParameters();
              requestLayout();
              parameters.setPictureSize(720,480);
              mCamera.setParameters(parameters);
              setCameraDisplayOrientation((MainActivity) activecontext,cameraId,mCamera);
              mCamera.startPreview();
          }
      }
  
      public static void setCameraDisplayOrientation(Activity activity,
                                                     int cameraId, android.hardware.Camera camera) {
  
          android.hardware.Camera.CameraInfo info =
                  new android.hardware.Camera.CameraInfo();
  
          android.hardware.Camera.getCameraInfo(cameraId, info);
  
          int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
          int degrees = 0;
  
          switch (rotation) {
              case Surface.ROTATION_0:
                  degrees = 0;
                  break;
              case Surface.ROTATION_90:
                  degrees = 90;
                  break;
              case Surface.ROTATION_180:
                  degrees = 180;
                  break;
              case Surface.ROTATION_270:
                  degrees = 270;
                  break;
          }
  
          int result;
          if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
              result = (info.orientation + degrees) % 360;
              result = (360 - result) % 360;  // compensate the mirror
          } else {  // back-facing
              result = (info.orientation - degrees + 360) % 360;
          }
          camera.setDisplayOrientation(result);
      }
  
  }
  and on activity `setContentView(R.layout.main);
  
          preview = new Preview(this, (SurfaceView)findViewById(R.id.surfaceView));
          preview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
          ((FrameLayout) findViewById(R.id.layout)).addView(preview);
          preview.setKeepScreenOn(true);
  
          preview.setOnClickListener(new OnClickListener() {
  
              @Override
              public void onClick(View arg0) {
                  camera.takePicture(shutterCallback, rawCallback, jpegCallback);
              }
          });  ..................................................................................................................................................@Override
      protected void onResume() {
          super.onResume();
          int numCams = Camera.getNumberOfCameras();
          if(numCams &gt; 0){
              try{
                  camera = Camera.open(0);
                  camera.startPreview();
                  preview.setCamera(camera);
              } catch (RuntimeException ex){
                  Toast.makeText(ctx, getString(R.string.camera_not_found), Toast.LENGTH_LONG).show();
              }
          }
      }
  
      @Override
      protected void onPause() {
          if(camera != null) {
              camera.stopPreview();
              preview.setCamera(null);
              camera.release();
              camera = null;
          }
          super.onPause();
      }
  
      private void resetCam() {
          camera.startPreview();
          preview.setCamera(camera);
      }
  
      private void refreshGallery(File file) {
          Intent mediaScanIntent = new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
          mediaScanIntent.setData(Uri.fromFile(file));
          sendBroadcast(mediaScanIntent);
      }
  
      ShutterCallback shutterCallback = new ShutterCallback() {
          public void onShutter() {
              //           Log.d(TAG, "onShutter'd");
          }
      };
  
      PictureCallback rawCallback = new PictureCallback() {
          public void onPictureTaken(byte[] data, Camera camera) {
              //           Log.d(TAG, "onPictureTaken - raw");
          }
      };
  
      PictureCallback jpegCallback = new PictureCallback() {
          public void onPictureTaken(byte[] data, Camera camera) {
              new SaveImageTask().execute(data);
              resetCam();
              Log.d(TAG, "onPictureTaken - jpeg");
          }
      };
  
      private class SaveImageTask extends AsyncTask&lt;byte[], Void, Void&gt; {
  
          @Override
          protected Void doInBackground(byte[]... data) {
              FileOutputStream outStream = null;
  
              // Write to SD Card
              try {
                  File sdCard = Environment.getExternalStorageDirectory();
                  File dir = new File (sdCard.getAbsolutePath() + "/camtest");
                  dir.mkdirs();               
  
                  String fileName = String.format("%d.jpg", System.currentTimeMillis());
                  File outFile = new File(dir, fileName);
  
                  outStream = new FileOutputStream(outFile);
                  outStream.write(data[0]);
                  outStream.flush();
                  outStream.close();
  
                  Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length + " to " + outFile.getAbsolutePath());
  
                  refreshGallery(outFile);
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              } finally {
              }
              return null;
          }
  
      }
  </code></pre>