I / art: no se puede encontrar la clase:

Hola, soy nuevo en este tipo de error de Android Studio. Puede ser solo una advertencia, pero he estado enfrentando un problema de no encontrar las clases.

En realidad, estoy trabajando en una aplicación API de cámara de Android y el problema es que mi vista previa de la cámara frontal es Stretch. Solo sucede con algunos dispositivos 2-3 comoHuawei p8 lite. ¡El dispositivo amplía la vista previa de la cámara cuando se cambia a la cámara frontal!

Tengo la clase de vista previa de la cámara como:

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's 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
}

He estado abordando este problema desde los últimos días y obteniendo el mismo efecto extendido en la vista previa de mi cámara personalizada.

Entonces, mi método para obtener tamaños de vista previa óptimos es:

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;
    }
}
El problema

El problema es estirar la vista previa de la cámara solo en la cámara frontal. Mis datos de registro de gato son los siguientes:

Muestra algunas líneas que comienzan como:I / art: no se puede encontrar la clase:. Como soy un novato, no tengo idea de qué significan.

Respuestas a la pregunta(1)

Su respuesta a la pregunta