Rotar una superficie de la cámaraVer a retrato

He buscado algunos mensajes sobre el cambio de la orientación de la cámara con una vista de la superficie, pero he tomado mi código de los ejemplos en:

Http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

La función que proporciona las dimensiones se ve así …

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) w / h; if (sizes == null) return null; Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; // Try to find an size match aspect ratio and size for (Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } // Cannot find the one match the aspect ratio, ignore the requirement if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } 

Mi problema es que cuando cambio la orientación del dispositivo, la vista previa se queda en el paisaje. Traté de configurar la orientación de la cámara, pero esto resultó en resultados muy extraños. ¿Alguien sabe lo que necesito cambiar para tener esta rotación correctamente?

5 Solutions collect form web for “Rotar una superficie de la cámaraVer a retrato”

El código para ajustar correctamente la orientación de vista previa de la cámara es un poco complejo, ya que tiene que tener en cuenta

  1. La orientación relativa del sensor y la orientación "natural" del dispositivo (que es retrato para los teléfonos, el paisaje para las tabletas, por lo general)
  2. La orientación actual de la interfaz de usuario del dispositivo (vertical, horizontal o inverso de cada uno)
  3. Si la cámara en cuestión es la cámara delantera o trasera (ya que la vista previa se refleja horizontalmente)

La documentación de Camera.setDisplayOrientation tiene código de ejemplo sobre cómo solucionarlo correctamente. Lo estoy reproduciendo aquí:

 public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); } 

Llame a esto después de que su interfaz de usuario se ha dibujado (onSurfaceChanged funcionaría como un indicador) o la IU del dispositivo gira (onConfigurationChanged funcionaría como un indicador).

Pude resolver el problema de la rotación poniendo el código siguiente en onSurfaceChanged ():

  if (mHolder.getSurface() == null) { // preview surface does not exist return; } // stop preview before making changes try { mCamera.stopPreview(); } catch (Exception e) { // ignore: tried to stop a non-existent preview } // make any resize, rotate or reformatting changes here if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { mCamera.setDisplayOrientation(90); } else { mCamera.setDisplayOrientation(0); } // start preview with new settings try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e) { Log.d(TAG, "Error starting camera preview: " + e.getMessage()); } 

PERO esto creó otro problema, o mejor dicho, no resolvió un problema, mientras que orientado correctamente, la imagen de vista previa todavía sólo tomó la misma cantidad de espacio que la vista del paisaje. Acabé simplemente renunciar y forzar la orientación horizontal con:

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

En onCreate () y diseñé mi diseño para el paisaje. Mucha suerte, y espero que alguien tenga una respuesta para este problema secundario!

Prueba esto, pero lo intenté en Samsung Galaxy Tab

 public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where to draw. mCamera = Camera.open(); Parameters params = mCamera.getParameters(); if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { params.set("orientation", "portrait"); mCamera.setDisplayOrientation(90); } try { mCamera.setPreviewDisplay(holder); } catch (IOException exception) { mCamera.release(); mCamera = null; } } 

Resolví este problema añadiendo:

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Al evento onCreate.

Por favor, intente esto ..

 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub if(previewing) { camera.stopPreview(); previewing = false; } Camera.Parameters parameters = camera.getParameters(); Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); int or=cameraInfo.orientation; // You need to choose the most appropriate previewSize for your app // .... select one of previewSizes here /* parameters.setPreviewSize(previewSize.width, previewSize.height);*/ if(display.getRotation() == Surface.ROTATION_0) { camera.setDisplayOrientation(90); or=90; } if(display.getRotation() == Surface.ROTATION_180) { camera.setDisplayOrientation(270); or=270; } if(display.getRotation() == Surface.ROTATION_270) { camera.setDisplayOrientation(180); or=180; } parameters.setRotation(or); camera.setParameters(parameters); try { camera.setPreviewDisplay(cameraSurfaceHolder); camera.startPreview(); previewing = true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 
  • Android: orientación de la vista previa de la cámara en modo vertical
  • ¿La imagen resultante de la cámara Android debe girarse después de la captura?
  • ¿Por qué no funciona setVisibility después de animar una vista?
  • Cómo manejar la rotación con Retrofit y RxJava / RxAndroid en Actividad?
  • Cómo girar el botón de acción flotante sin girar la sombra?
  • Android gire TextView en nivel de API> = 8
  • Imagen giratoria. Animación de la lista o rotación animada? (Androide)
  • Comprensión del uso de ImageView Matrix
  • Cómo deshabilitar / evitar Fragment animaciones personalizadas después de la rotación de la pantalla
  • Android: Obtener rotación EXIF ​​desde URI
  • ¿Rotar imágenes alrededor de un círculo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.