0

Ich bin an einem Punkt fest, dass ich die Ausrichtung des Bildes nicht ändern kann, wenn ich das Bild mit benutzerdefinierten Kamera aufgenommen habe. Ich möchte die Ausrichtung manuell handhaben. Ich weiß nicht, wie man ein Bild in onConfiguration ändert, wenn Camera.PictureCallback aufgerufen wird. Ich habe die Ausrichtung erfolgreich geändert, wenn das Foto nicht aufgenommen wurde. Ich stelle kein Bild in einer Bildansicht ein, sondern zeige es in der Oberflächenansicht an. Hier ist mein Code framelayout und Oberfläche der Einstellung für sie:Android, wie ein Foto je nach Ausrichtung zu drehen, wenn das Bild benutzerdefinierte Kamera

Framelayout camera_view = (FrameLayout) findViewById(R.id.camera_view); 
CameraSurfaceCreater mCameraView = new CameraSurfaceCreater(this, mCamera, CameraSetter.this);//create a SurfaceView to show camera data 
      camera_view.addView(mCameraView);//add the SurfaceView to the layout 

wenn Bild aufgenommen wird:

Camera.PictureCallback mPicture = new Camera.PictureCallback() { 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 

       pictaken = true; 
      } 
}; 

und in onConfiguration Geändert:

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 

     // Checks the orientation of the screen 
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
      if(!isPictureTaken){ 
       setCameraDisplayOrientation(CameraSetter.this, 0, mCamera); 
      }else { 
       //dont know how to rotate a photo when picture is taken 
      } 

     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
      if(!isPictureTaken){ 
       setCameraDisplayOrientation(CameraSetter.this, 0, mCamera); 
      } 

     } 
    } 

Jede Hilfe sehr geschätzt wird. Muss ich framelayout drehen oder was ich tun muss, nachdem das Foto aufgenommen wurde und der Benutzer die Ausrichtung ändert.

Antwort

0

Nutzen Sie OrientationEventListener wie folgt:

OrientationEventListener mOrientationEventListener = new OrientationEventListener(mApplication, 
      SensorManager.SENSOR_DELAY_NORMAL) { 

     @Override 
     public void onOrientationChanged(int orientation) { 

      if ((orientation == ORIENTATION_UNKNOWN) || (mCamera == null)) { 
       return; 
      } 

      Log.e("current_ori", "" + orientation); 

      Camera.Parameters params = mCamera.getParameters(); 
      Camera.CameraInfo info = new Camera.CameraInfo(); 

      Camera.getCameraInfo(cameraId, info); 

      orientation = (orientation + 45)/90 * 90; 

      int rotation = 0; 

      if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 

       //Below one line will rotate image to portrait 
       // rotation = (info.orientation - orientation + 360) % 360; 

       //Below code makes image exactly how it has been captured(with mirror) 

       if (orientation == 360 || orientation == 0 || orientation == 180) { 
        rotation = 270; 
       } else if (orientation == 90 || orientation == 270) { 
        rotation = 90; 
       } 

      } else { 
       /* 
       * back-facing camera 
       */ 
       //Below one line will rotate image to portrait 
       //rotation = (info.orientation + orientation) % 360; 

       //Below line makes image exactly how it has been captured 
       rotation = 90; 

      } 

      params.setRotation(rotation); 

      if (null == mCamera) { 
       return; 
      } 

      mCamera.setParameters(params); 
     } 
    }; 

Vergessen Sie nicht zu aktivieren und deaktivieren OrientationEventListener:

zu aktivieren:

if (mOrientationEventListener.canDetectOrientation()) { 
     mOrientationEventListener.enable(); 
    } 

zu deaktivieren:

if (mOrientationEventListener.canDetectOrientation()) { 
     mOrientationEventListener.disable(); 
    } 
+0

Danke für Ihre Antwort. Aber wo sollte ich diesen OrientationEventListener im Code hinzufügen? oder sollte ich die onkonfiguration entfernen? – exceptionnotgood

+0

Sie können diesen Code in Ihrem onCreate() hinzufügen, aber stellen Sie sicher, dass Sie diesen Code verwenden, nachdem die Kamera initialisiert wurde. Aktivieren Sie dies von onResume() und Disable von onPause(). –

+0

Dies hat ein Problem, dass, wenn Sie ein Bild aufnehmen und das Gerät in das Querformat bewegt wird, das Bild entfernt wird und die Kamera wieder eingeschaltet wird. – exceptionnotgood

Verwandte Themen