Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: la vista previa de la cámara es lateral

Estoy usando una vista previa para mostrar lo que ve la cámara en la pantalla.

Puedo conseguir que todo funcione bien, superficie creada, superficie fijada y la superficie se exhibe.

  • Android: OnBootReceiver: El receptor exportado no requiere permiso
  • Nuevo paquete aún no registrado en el sistema. Error en un teléfono real
  • Google Play - Diferencia entre el vencimiento bajo y la madurez media
  • ¿Por qué no deslizar Carga una imagen de ID de recurso a mi ImageView?
  • Android: falla en la imagen de carga de Picasso. Cómo mostrar mensaje de error
  • ¿Cuál es el uso de @SuppressLint ("InlinedApi")
  • Sin embargo, siempre muestra la imagen en un ángulo incorrecto de 90 grados en el modo retrato.

    Como en la foto:

    texto alternativo

    Estoy enterado que usar el código siguiente fijará la imagen recta:

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    Sin embargo, tengo la vista previa dentro de una actividad que tiene otros elementos en ella y no tiene sentido que mi actividad se muestre en modo horizontal. (Desactivado por defecto)

    Así que me preguntaba si hay alguna manera de cambiar la orientación de la vista previa? ¿Y dejar el resto de mi actividad correctamente exhibido en modo de retrato?

    O de todos modos para girar la vista previa para que se muestra correctamente?

  • ¿Por qué en el patrón ViewHolder la clase ViewHolder debe ser estática?
  • Crear un archivo aar en Android Studio
  • Cargar imágenes de la carpeta de activos
  • Picasso sigue recargando imágenes mientras se desplaza hacia arriba en listview, carga lentamente
  • BitmapTransformation en la biblioteca Glide no funciona como se esperaba
  • ADB se estrella en Eclipse
  • 8 Solutions collect form web for “Android: la vista previa de la cámara es lateral”

    Este problema parecía comenzar como un error con cierto hardware ver aquí pero se puede superar mediante el uso de la llamada a mCamera.setDisplayOrientation (grados) disponible en API 8. Así que esto es cómo lo implemento:

     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (isPreviewRunning) { mCamera.stopPreview(); } Parameters parameters = mCamera.getParameters(); Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); if(display.getRotation() == Surface.ROTATION_0) { parameters.setPreviewSize(height, width); mCamera.setDisplayOrientation(90); } if(display.getRotation() == Surface.ROTATION_90) { parameters.setPreviewSize(width, height); } if(display.getRotation() == Surface.ROTATION_180) { parameters.setPreviewSize(height, width); } if(display.getRotation() == Surface.ROTATION_270) { parameters.setPreviewSize(width, height); mCamera.setDisplayOrientation(180); } mCamera.setParameters(parameters); previewCamera(); } 

    Y el método previewCamera:

     public void previewCamera() { try { mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); isPreviewRunning = true; } catch(Exception e) { Log.d(APP_CLASS, "Cannot start preview", e); } } 

    Esto fue en un HTC Desire y tuve que poner inicialmente en las declaraciones de registro en cada uno de los controles de rotación para decir cuál era la rotación y, a continuación, depurado en el dispositivo y observó la salida logCat mientras rota el dispositivo. Para el deseo de HTC, 0 era el teléfono como usted habría esperado (retrato), 90 grados estaba girando el teléfono 90 grados en contra de las agujas del reloj (yo había asumido que habría sido en sentido horario). En el código que verás no necesité hacer ninguna rotación de la exhibición cuando el teléfono estaba en 90 o 180 grados – el dispositivo parecía manejar esto sí mismo. Sólo un punto no funciona correctamente: La rotación de 270 grados es cuando se gira el dispositivo 90 grados en el sentido de las agujas del reloj y los contadores de rotación de la pantalla que bien, pero si gira el dispositivo 270 grados en sentido contrario a las agujas del reloj, no parece compensar adecuadamente.

    PS Observe el swapover de ancho y altura en las rotaciones apropiadas.

    Intente ajustar la orientación de la pantalla. Resuelve mi problema.

      mCamera.setDisplayOrientation(90); 
      public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); mCamera.setDisplayOrientation(90); try { mCamera.setPreviewDisplay(holder); mCamera.setPreviewCallback(new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { } }); } catch (Exception e) { e.printStackTrace(); } } 

    Prueba este código

    Lo hice tomando el consejo de mCamera.setDisplayOrientation (90); Sino también rotar el mapa de bits porque por alguna razón los enfoques de otros no funciona para mí en la versión 2.3.3.

    Para girar el mapa de bits hice esto:

     Matrix matrix = new Matrix(); matrix.postRotate(90); imageView1 = new ImageView(this); Bitmap bitmap = BitmapFactory.decodeFile(files[i].getAbsolutePath()); Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 80, 80, true); imageView1.setImageBitmap(scaledBitmap); 

    He comparado mi código con el tutorial y lo que finalmente arregló fue poner el siguiente código en mi AndroidManifext.xml: En la etiqueta <activity> :

     android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation"> 

    Estoy teniendo problema con la cámara delantera (problema al revés). Entonces yo uso este método

     public void setCameraDisplayOrientation(Activity activity , int icameraId , Camera camera1s) { CameraInfo cameraInfo = new CameraInfo(); Camera.getCameraInfo(icameraId, cameraInfo); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; // k 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 (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { // cameraType=CAMERATYPE.FRONT; result = (cameraInfo.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (cameraInfo.orientation - degrees + 360) % 360; } // displayRotate=result; camera.setDisplayOrientation(result); } 
     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // If your preview can change or rotate, take care of those events here. // Make sure to stop the preview before resizing or reformatting it. if (mHolder.getSurface() == null) { // preview surface does not exist return; } try { mCamera.stopPreview(); } catch (Exception e) { e.printStackTrace(); } Camera.Parameters parameters = mCamera.getParameters(); Display display = ((WindowManager) getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); if (display.getRotation() == Surface.ROTATION_0) { parameters.setPreviewSize(h, w); mCamera.setDisplayOrientation(90); } if (display.getRotation() == Surface.ROTATION_90) { parameters.setPreviewSize(w, h); mCamera.setDisplayOrientation(0); } if (display.getRotation() == Surface.ROTATION_180) { parameters.setPreviewSize(h, w); mCamera.setDisplayOrientation(270); } if (display.getRotation() == Surface.ROTATION_270) { parameters.setPreviewSize(w, h); mCamera.setDisplayOrientation(180); } previewCamera(); } public void previewCamera() { try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e) { //Log.d(APP_CLASS, "Cannot start preview", e); e.printStackTrace(); } } 

    Esta pieza de línea funcionó para mí perfectamente

      static { ORIENTATIONS.append(Surface.ROTATION_0, 90); ORIENTATIONS.append(Surface.ROTATION_90, 180); ORIENTATIONS.append(Surface.ROTATION_180, 270); ORIENTATIONS.append(Surface.ROTATION_270, 360); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.