Hi, I am new to these types of Android Studio Error. Maybe this is just a warning, but I ran into the problem of not finding classes.
I'm actually working on an API for an Android camera, and the problem is that my preview of the front face camera is stretching. This only happens with 2-3 devices like Huawei p8 lite . When switching to the front camera, the device stretches the cameraโs preview.
I have a camera preview class like:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { //Variables de' Preview private SurfaceHolder mHolder; private List<Camera.Size> mSupportedPreviewSizes; private Camera.Size mPreviewSize; private int FOCUS_AREA_SIZE=300; public static Camera previewCamera; //////////////////////// //protected LOGGER keys protected final String EXCEPTION_KEY="xception"; ////////////////////////// public CameraPreview(Context context, Camera camera) { super(context); //get the camera previewCamera = camera; if(previewCamera!=null){ // supported preview sizes mSupportedPreviewSizes = previewCamera.getParameters().getSupportedPreviewSizes(); } else{ previewCamera=camera; // supported preview sizes mSupportedPreviewSizes = previewCamera.getParameters().getSupportedPreviewSizes(); } // 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); setKeepScreenOn(true); setPreview(); } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { try{ //when the surface is created, we can set the camera to draw images in this surfaceholder setPreview(); previewCamera.setPreviewDisplay(surfaceHolder); previewCamera.startPreview(); if(CameraActivity.cameraId==1){ previewCamera.setFaceDetectionListener(faceDetectionListener); previewCamera.startFaceDetection(); } } catch(Exception exp){ Log.i(EXCEPTION_KEY,"FROM surfaceCreated: "+exp.toString()); } } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { //before changing the application orientation, you need to stop the preview, rotate and then start it again if(mHolder.getSurface() == null)//check if the surface is ready to receive camera data return; try{ previewCamera.stopPreview(); } catch (Exception e){ //this will happen when you are trying the camera if it not running } //now, recreate the camera preview try{ //set the camera preview on every preview change setPreview(); //in case the preview is still stretched bingo! Then... // Camera.Parameters params = previewCamera.getParameters(); // List<Camera.Size> sizes = params.getSupportedPreviewSizes(); // Camera.Size optimalSize = PreviewSizeParameters.getOptimalPreviewSize(sizes,i2,i3); // params.setPreviewSize(optimalSize.width,optimalSize.height); // previewCamera.setParameters(params); previewCamera.setPreviewDisplay(mHolder); previewCamera.startPreview(); if(CameraActivity.cameraId==1){ previewCamera.setFaceDetectionListener(faceDetectionListener); previewCamera.startFaceDetection(); } } catch(Exception exp){ Log.i(EXCEPTION_KEY,"FROM surfaceChanged: "+exp.toString()); } } public void setPreview(){ try{ //set the focusable true this.setFocusable(true); //set the touch able true this.setFocusableInTouchMode(true); //set the camera display orientation lock previewCamera.setDisplayOrientation(90); //get the camera parameters Camera.Parameters parameters = previewCamera.getParameters(); //set the preview size parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); //set the parameter previewCamera.setParameters(parameters); }catch(Exception exp){ Log.i(EXCEPTION_KEY,"FROM setPreview: "+exp.toString()); } } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { //our app has only one screen, so we'll destroy the camera in the surface //if you are using with more screens, please move this code your activity try{ //handle in Activity onResume and onPause }catch(Exception exp){ Log.i(EXCEPTION_KEY,"FROM surfaceDestroyed: "+exp.toString()); } } //Override Methods here @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { try{ final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); setMeasuredDimension(width, height); if (mSupportedPreviewSizes != null) { mPreviewSize = PreviewSizeParameters.getOptimalPreviewSize(mSupportedPreviewSizes, width, height); } }catch(Exception exp){ Log.i(EXCEPTION_KEY,"FROM onMeasure: "+exp.toString()); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// private void stopPreviewAndFreeCamera() { if (previewCamera != null) { // Call stopPreview() to stop updating the preview surface. previewCamera.stopPreview(); // Important: Call release() to release the camera for use by other // applications. Applications should release the camera immediately // during onPause() and re-open() it during onResume()). previewCamera.release(); previewCamera = null; } } //end of outer class here }
I have been dealing with this problem since the last few days and get the same stretch effect on my custom camera preview.
So my method of getting optimal preview sizes:
public class PreviewSizeParameters { //protected LOGGER keys protected static final String EXCEPTION_KEY = "xception"; ////////////////////////// public static Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) h / w; if (sizes == null) return null; Camera.Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; for (Camera.Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Camera.Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } }
Problem
The problem is stretching the camera preview on the front of the camera. My log cat details are as follows:
Shows several lines starting with: I / art: Could not find class:. Since I'm new, so I have no idea what they mean? 