Kamera przednia z Androidem odbierająca odwrócone zdjęcia

Mam tę aplikację, która działa w trybie portretowym i jako część jednego działania mam obiekt aparatu działający jako fragment w nim.

Mam możliwość przełączenia się z aparatu z przodu na aparat z tyłu i podczas robienia zdjęć tylnym aparatem wszystko jest w porządku.

Kiedy robię zdjęcia aparatem skierowanym do przodu, są one odwrócone o 180 stopni. Teraz wiem, że jest to prawdopodobnie związane z orientacją w trybie portretu, ale posiadanie jej w krajobrazie po prostu zabije pomysł mojej aplikacji.

Czy mimo to można to naprawić, aby zrobione zdjęcie było takie samo, jak to, które widzisz w podglądzie?

<code>        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");
</code>

Problem polega na tym, że po próbie zrobienia zdjęcia ta rzecz ulega awarii. Ponadto, jeśli działa przez chwilę w trybie podglądu, ponownie się zawiesza. Powinienem też chyba dodać, że w innej metodzie to robię.

<code>   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;

        }
    }
</code>

Jest to wywoływane, gdy przełączasz się między kamerami (tyłem do przodu i odwrotnie). Czy może to kolidować ze słuchaczem zdarzeń orientacji?

Również podczas zapisywania zrobionego zdjęcia dzwonię. Wcześniej zajmował się tylko danymi jako parametrem, ale starałem się, aby to także miało orientację na ekranie. Problem polega na tym, że orientacja ekranu wynosi zawsze 90, bez względu na wszystko. Tak więc mapa bitowa będzie zawsze obracana o 90 stopni (co doskonale nadaje się do robienia zdjęć tylnym aparatem), ale odwraca ją podczas robienia zdjęcia przednim aparatem. Czy w tej funkcji można zaimplementować poprawkę?

<code>  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;
}
</code>

questionAnswers(2)

yourAnswerToTheQuestion