La vista previa de la cámara se está estirando

He escrito un código que utiliza para mostrar la cámara. A continuación se muestra el código de mi archivo de diseño,

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <FrameLayout android:id="@+id/previewLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" > </FrameLayout> <LinearLayout android:id="@+id/startBar" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:background="@drawable/leftbarbg" android:orientation="vertical" android:gravity="center"> <ImageView android:id="@+id/MuteBtn" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="2" android:src="@drawable/mutebtn" /> <ImageView android:id="@+id/VideosBtn" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="2" android:src="@drawable/videosbtn" /> <ImageView android:id="@+id/RecBtn" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="3" android:src="@drawable/action_rec_selected" /> <ImageView android:id="@+id/SettingsBtn" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="2" android:src="@drawable/settingsbtn" /> <ImageView android:id="@+id/ChatBtn" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="2" android:src="@drawable/chatbtn" > </ImageView> </LinearLayout> <RelativeLayout android:id="@+id/stopBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="3dp" android:visibility="gone" > <ImageView android:id="@+id/StopBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/stopbtn" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="20dp" android:layout_marginLeft="20dp" android:layout_marginRight="70dp" android:layout_marginTop="20dp" > <ImageView android:id="@+id/MenuBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:src="@drawable/menubtn" /> <ImageView android:id="@+id/LiveModeBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:src="@drawable/livemodeoff" /> <Chronometer android:id="@+id/video_chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:textSize="28sp" android:textStyle="bold" /> </RelativeLayout> </RelativeLayout> 

Y este es mi código de CameraSurfaceview,

 public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder; private Camera camera; private MediaRecorder mediaRecorder; private Boolean previewing; private AutoFocusManager autoFocusManager; private CameraDetectionObserver cameraDetectionObserver; public CameraSurfaceView(Context context, AutoFocusManager autoFocusManager, CameraDetectionObserver cameraDetectionObserver) { super(context); this.holder = this.getHolder(); this.holder.addCallback(this); this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); this.autoFocusManager= autoFocusManager; this.cameraDetectionObserver= cameraDetectionObserver; } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (camera != null) { Camera.Parameters parameters = camera.getParameters(); List< String > FlashModes = parameters.getSupportedFlashModes(); if (FlashModes.contains(Parameters.FLASH_MODE_AUTO)) { parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); System.out.println("FLASH_MODE_AUTO"); } List< String > WhiteBalance = parameters.getSupportedWhiteBalance(); if (WhiteBalance.contains(Parameters.WHITE_BALANCE_AUTO)) { parameters.setFlashMode(Parameters.WHITE_BALANCE_AUTO); System.out.println("WHITE_BALANCE_AUTO"); } List< String > Antibanding = parameters.getSupportedAntibanding(); if (Antibanding.contains(Parameters.ANTIBANDING_AUTO)) { parameters.setAntibanding(Camera.Parameters.ANTIBANDING_AUTO); System.out.println("ANTIBANDING_AUTO"); } List<Size> previews = parameters.getSupportedPreviewSizes(); int i = 0; parameters.setPreviewSize( previews.get(4).width, previews.get(4).height ); camera.setParameters(parameters); camera.startPreview(); autoFocusManager.startAutoFocus(camera); } } @Override public void surfaceCreated(SurfaceHolder holder) { if (camera != null) { camera.release(); camera = null; } try { camera = Camera.open(findBackFacingCamera()); camera.setPreviewDisplay(holder); previewing = true; cameraDetectionObserver.cameraInitializationStatus(true); } catch (IOException e) { camera.release(); camera = null; }catch (Exception e) { e.printStackTrace(); cameraDetectionObserver.cameraInitializationStatus(false); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (previewing) { camera.stopPreview(); camera.release(); camera = null; previewing = false; autoFocusManager.stopAutoFocus(); System.out.println("surface destroyed"); } } public void stopPreview(){ if (previewing) { camera.stopPreview(); camera.release(); camera = null; previewing = false; autoFocusManager.stopAutoFocus(); System.out.println("surface destroyed"); } } public Camera getCamera() { return this.camera; } public MediaRecorder getMediaRecorder(){ mediaRecorder = new MediaRecorder(); camera.unlock(); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mediaRecorder.setPreviewDisplay(holder.getSurface()); mediaRecorder.setVideoFrameRate(29); mediaRecorder.setVideoSize(ByteArraysForLogin.VideoDimention.vWidth,ByteArraysForLogin.VideoDimention.vHeight); return mediaRecorder; } private int findBackFacingCamera() { int cameraId = -1; // Search for the back facing camera int numberOfCameras = Camera.getNumberOfCameras(); for (int i = 0; i < numberOfCameras; i++) { CameraInfo info = new CameraInfo(); Camera.getCameraInfo(i, info); if (info.facing == CameraInfo.CAMERA_FACING_BACK) { cameraId = i; break; } } return cameraId; } } 

El código anterior funciona bien, pero muestra la vista previa de la cámara en formato extendido en modo horizontal y vertical como imagen siguiente.

Introduzca aquí la descripción de la imagenIntroduzca aquí la descripción de la imagen

Sin embargo, la imagen resultante de la cámara no se estira es en modo normal sólo la vista previa se estira.

PS Estoy haciendo esta pregunta después de intentar esto

Intenta agregar

 getWindow().setFormat(PixelFormat.UNKNOWN); 

En tu creacion

Si eso no ayuda tal vez la configuración de la rotación?

 camera.setDisplayOrientation(90); 

Y si eso todavía no ayuda, todos los resultados en Google están diciendo que la relación de aspecto del SurfaceView debe emparejar la relación de aspecto de la cámara

Intente utilizar diferentes resoluciones y aumentar el ancho y la altura del marco

  • Manejo correcto de la excepción: "getParameters failed (empty parameters)"
  • Tome y guarde la imagen presionando el botón
  • Android ACTION_IMAGE_CAPTURE a veces no llama aActivityResult
  • ¿Es posible utilizar la cámara delantera y trasera al mismo tiempo en Android
  • El flash de la cámara Nexus 4 no se dispara cuando el modo de enfoque está ajustado en imagen continua
  • La intención de la cámara Android crea dos archivos
  • Cómo indentify dedo está en la lente de la cámara o no en android?
  • ¿Cómo detectar si hay cámara frontal y si hay cómo llegar y utilizar la cámara frontal?
  • ¿Cómo usar la cámara de Android o la API de la cámara2 para admitir versiones antiguas y nuevas de la API sin notas de reprobación?
  • Cómo capturar una foto de la cámara sin intención
  • Open failed: ENOENT (No hay tal archivo o directorio) error
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.