Фронтальная камера Android, делающая перевернутые фотографии

У меня есть это приложение, которое работает в портретном режиме, и как часть одного действия у меня есть объект камеры, работающий как фрагмент в нем..

У меня есть возможность переключаться между передней и задней -камерой, и при съемке на заднюю камеру все нормально.

Когда я делаю фотографии фронтальной -камерой, они переворачиваются на 180 градусов. Теперь я знаю, что это, вероятно, как-то связано с ориентацией в портретном режиме, но альбомная ориентация просто убила бы идею моего приложения.

Можно ли это как-то исправить, чтобы сделанное изображение было таким же, как то, которое вы видите в предварительном просмотре?

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

Проблема в том, что после того, как я пытаюсь сделать снимок, эта штука вылетает. Кроме того, если он некоторое время работает только в режиме предварительного просмотра, он снова вылетает. Я также, вероятно, должен добавить, что в другом методе я делаю это.

   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;

        }
    }

Вызывается, когда вы переключаетесь между камерами (с обратной стороны на лицевую и наоборот -с камеры ). Может ли это мешать прослушивателю событий ориентации?

Также при сохранении сделанного снимка я так и называю. Раньше он просто принимал данные в качестве параметра, но я попытался сделать так, чтобы он также принимал ориентацию экрана. Проблема в том, что ориентация экрана всегда 90, несмотря ни на что. Таким образом, растровое изображение всегда будет повернуто на 90 градусов (, что отлично подходит для фотосъемки задней камерой ), но инвертируется при съемке фронтальной камерой. Можно ли исправить эту функцию?

  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;
}
18
задан Valentin 25 April 2012 в 10:54
поделиться