Je suis confronté à un problème avec la vue de la caméra, c'est-à-dire que la vue de la caméra est étirée et ne donne pas une vue normale comme le donne l'application de caméra par défaut ou toute autre application de caméra. Je n'ai pas pu obtenir la vue de la surface que la caméra utilise pour s'étirer au-delà de la taille de l'écran.

 enter code here
  private class SurfaceCallback implements SurfaceHolder.Callback {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            camera = Camera.open(); 
            camera.setPreviewDisplay(holder); 
            camera.setDisplayOrientation(getPreviewDegree(MainActivity.this));
            camera.startPreview(); // 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        setCameraParameters();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
}
  private int getPreviewDegree(Activity activity) {
    int rotation = activity.getWindowManager().getDefaultDisplay()
            .getRotation();
    int degree = 0;

    switch (rotation) {
        case Surface.ROTATION_0:
            degree = 90;
            break;
        case Surface.ROTATION_90:
            degree = 0;
            break;
        case Surface.ROTATION_180:
            degree = 270;
            break;
        case Surface.ROTATION_270:
            degree = 180;
            break;
    }
    return degree;
}

private void setCameraParameters() {

    Camera.Parameters parameters = camera.getParameters();

    List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
    if (sizeList.size() > 0) {
        Camera.Size cameraSize = sizeList.get(0);

        parameters.setPreviewSize(cameraSize.width, cameraSize.height);
    }


    sizeList = parameters.getSupportedPictureSizes();
    if (sizeList.size() > 0) {
        Camera.Size cameraSize = sizeList.get(0);
        for (Camera.Size size : sizeList) {

            if (size.width * size.height < 10 * 100) {
                cameraSize = size;
                break;
            }
        }
        parameters.setPictureSize(cameraSize.width, cameraSize.height);
    }

    parameters.setPictureFormat(ImageFormat.JPEG);
    parameters.setJpegQuality(100);
    parameters.setJpegThumbnailQuality(100);

    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
    camera.setParameters(parameters);

    startOrientationChangeListener();
}

private void startOrientationChangeListener() {

    OrientationEventListener mOrEventListener = new    OrientationEventListener(MainActivity.this) {
        @Override
        public void onOrientationChanged(int rotation) {

            if (((rotation >= 0) && (rotation <= 45)) || (rotation > 315)) {
                rotation = 0;
            } else if ((rotation > 45) && (rotation <= 135)) {
                rotation = 90;
            } else if ((rotation > 135) && (rotation <= 225)) {
                rotation = 180;
            } else if ((rotation > 225) && (rotation <= 315)) {
                rotation = 270;
            } else {
                rotation = 0;
            }
            if (rotation == mOrientation)
                return;
            mOrientation = rotation;
            updateCameraOrientation();
        }
    };
    mOrEventListener.enable();
}

 private void updateCameraOrientation() {
    if (camera != null) {
        Camera.Parameters parameters = camera.getParameters();

        int rotation = 90 + mOrientation == 360 ? 0 : 90 + mOrientation;

        if (mIsFrontCamera) {
            if (rotation == 90) rotation = 270;
            else if (rotation == 270) rotation = 90;
        }
        parameters.setRotation(rotation);

        camera.setDisplayOrientation(90);
        camera.setParameters(parameters);
    }
}
4
Harpal Singh 24 déc. 2015 à 12:51

2 réponses

Meilleure réponse

Vous pouvez commencer avec ce projet. https://github.com/pikanji/CameraPreviewSample

0
Dinesh Kannan 24 déc. 2015 à 10:02

Essayez après avoir ajouté des paramètres SurfaceHoler dans la méthode surfaceCreated de la classe Surface Callback:

  holder = mSurfaceView.getHolder();
  holder.addCallback(this);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

J'espère que cela vous aide.

0
Mihir Trivedi 24 déc. 2015 à 10:14