Android Front Face À La Caméra De Prendre Inversé Les Photos

J'ai cette application qui est en cours d'exécution en mode portrait et en tant que partie d'une activité, j'ai un objet caméra fonctionnant comme un fragment.

J'ai la possibilité de basculer d'avant en arrière face à la caméra et lorsque vous prenez des photos avec la caméra arrière, tout est beau et bien.

Lorsque je prends des photos avec la caméra frontale, cependant, elles sont inversé de 180 degrés.
Maintenant, je sais que c'est probablement quelque chose à voir avec l'orientation étant en mode portrait, mais de l'avoir dans un paysage de tuer l'idée de ma candidature.

Est-il de toute façon cela peut être réglé de sorte que le prendre en photo est le même que celui que vous voyez dans l'aperçu?

        listener = new OrientationEventListener(this.getActivity(),SensorManager.SENSOR_DELAY_NORMAL){

        @Override
        public void onOrientationChanged(int orientation) {
            //TODO Auto-generated method stub
            if (orientation == ORIENTATION_UNKNOWN) return;
             android.hardware.Camera.CameraInfo info =
                    new android.hardware.Camera.CameraInfo();
             android.hardware.Camera.getCameraInfo(mCurrentCamera, info);
             orientation = (orientation + 45) / 90 * 90;
             int rotation = 0;
             if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
                 rotation = (info.orientation - orientation + 360) % 360;
             } else {  //back-facing camera
                 rotation = (info.orientation + orientation) % 360;
             }
             if (mCamera.getParameters() != null){
             Camera.Parameters mParameters = mCamera.getParameters();

             mParameters.setRotation(rotation);
             mCamera.setParameters(mParameters);
             }
        }

    };
    listener.enable();
    if (listener.canDetectOrientation())
        Log.d("Orientation Possible", "Orientation Possible");

Le problème, c'est après que j'essaie un de prendre une photo de cette chose se bloque. Aussi, si il fonctionne pendant un moment juste en mode aperçu, il se bloque de nouveau. Je dois sans doute ajouter, que dans une autre méthode, je suis en train de faire cela.

   public void switchCamera(Camera camera) {
    setCamera(camera);
    try {
        camera.setPreviewDisplay(mHolder);
    } catch (IOException exception) {
        Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
    }
    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);

    requestLayout();


    try{
        camera.setParameters(parameters);
    }
    catch (RuntimeException ex){
        Log.d("Preview", "Failure to set proper parameters");
        //need to improve this method
        if (mSupportedPreviewSizes != null) {
            Camera.Size cs = mSupportedPreviewSizes.get(0);
            parameters.setPreviewSize(cs.width, cs.height);
            camera.setParameters(parameters);
            requestLayout();
            //int tempheight = mPreviewSize.height;
            //mPreviewSize.height = mPreviewSize.width;
            //mPreviewSize.width = tempheight;

        }
    }

Ce qui est appelé lorsque vous basculez entre les caméras(de l'arrière vers l'avant face à vice-versa). Cela pourrait interférer avec l'orientation de l'écouteur d'événement?

Aussi, lors de l'enregistrement de la photo prise, c'est ce que je l'appelle. Avant c'était juste la prise de données d'un paramètre, mais j'ai essayé de lui faire prendre l'orientation de l'écran. Le problème, c'est l'orientation de l'écran est toujours à 90, n'importe quoi. Si le bitmap sera toujours une rotation de 90 degrés(ce qui est idéal pour prendre des photos avec la caméra arrière) mais à l'inverse quand le prendre avec l'appareil photo frontal. Pourrait un correctif soit mis en œuvre dans cette fonction?

  public static Bitmap MakeSquare(byte[] data, int orientation) {
    int width;
    int height;
    //Rotate photo
    Matrix matrix = new Matrix();
    matrix.postRotate(orientation);
    //Convert ByteArray to Bitmap
    Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length);
    width = bitPic.getWidth();
    height = bitPic.getHeight();


    //Create new Bitmap out of the old one
    Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true);
    bitPic.recycle();
    int desWidth;
    int desHeight;
    desWidth = bitPicFinal.getWidth();
    desHeight = desWidth;
    Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight);
    croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true);
    return croppedBitmap;
}

OriginalL'auteur Valentin | 2012-04-23