Problemas para tomar fotos con Android (Cámara vertical | Retrato)

Con el siguiente código muestra una vista previa de la cámara verticalmente y funciona .. PERO !! ¡Consigo una foto en paisaje! 🙁

¿Cómo puedo construirlo verticalmente? Tengo la vista preliminar en vertical, pero no puedo guardar la imagen verticalmente.

Saludos y gracias, Fran

AL HACER CLIC

public void onClick(View arg0) { camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG); } 

AVANCE

 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (previewing) { camera.stopPreview(); previewing = false; } if (camera != null) { /* * camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); * previewing = true; */ Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(width, height); camera.setParameters(parameters); // Condicions per utilitzar la orientacio adecuada segons el sdk if (Integer.parseInt(Build.VERSION.SDK) >= 8) setDisplayOrientation(camera, 90); else { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { parameters.set("orientation", "portrait"); parameters.set("rotation", 90); } if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { parameters.set("orientation", "landscape"); parameters.set("rotation", 90); } camera.setParameters(parameters); } // camera.startPreview(); previewing = true; } } 

TOMAR FOTO

 PictureCallback myPictureCallback_JPG = new PictureCallback() { @Override public void onPictureTaken(byte[] arg0, Camera arg1) { // intentar canvia horientacio Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); //bitmapPicture. OutputStream imageFileOS; try { imageFileOS = new FileOutputStream(String.format("/sdcard/DCIM/iboo/captura.jpg")); imageFileOS.write(arg0); imageFileOS.flush(); imageFileOS.close(); // Missatge en cas de capturar l'imatge correctament Toast.makeText(Principal.this, "Imatge Capturada!", Toast.LENGTH_LONG).show(); MostrarFoto("/sdcard/DCIM/iboo/captura.jpg"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // camera.startPreview(); } }; 

Es la solución que implementé. Funciona perfectamente. Espero que eso ayude.

 PictureCallback myPictureCallback_JPG = new PictureCallback() { @Override public void onPictureTaken(byte[] arg0, Camera arg1) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 6; options.inDither = false; // Disable Dithering mode options.inPurgeable = true; // Tell to gc that whether it needs free // memory, the Bitmap can be cleared options.inInputShareable = true; // Which kind of reference will be // used to recover the Bitmap // data after being clear, when // it will be used in the future options.inTempStorage = new byte[32 * 1024]; options.inPreferredConfig = Bitmap.Config.RGB_565; bMap = BitmapFactory.decodeByteArray(arg0, 0, arg0.length, options); // others devices if(bMap.getHeight() < bMap.getWidth()){ orientation = 90; } else { orientation = 0; } Bitmap bMapRotate; if (orientation != 0) { Matrix matrix = new Matrix(); matrix.postRotate(orientation); bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true); } else bMapRotate = Bitmap.createScaledBitmap(bMap, bMap.getWidth(), bMap.getHeight(), true); FileOutputStream out; try { out = new FileOutputStream( String.format("/sdcard/DCIM/test/screen.jpg")); bMapRotate.compress(Bitmap.CompressFormat.JPEG, 90, out); if (bMapRotate != null) { bMapRotate.recycle(); bMapRotate = null; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } camera.startPreview(); MostrarFoto(imageInSD); editor = prefs.edit(); editor.putString("PathSeleccio", imageInSD); editor.commit(); } }; 

Echa un vistazo aquí .

 Camera.Parameters param; param = camera.getParameters(); Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); if(display.getRotation() == Surface.ROTATION_0) { camera.setDisplayOrientation(90); param.setRotation(90); } if(display.getRotation() == Surface.ROTATION_270) { camera.setDisplayOrientation(180); param.setRotation(180); } camera.setParameters(param); camera.takePicture(shutterCallback, rawCallback, jpegCallback); 

Para configurar la orientación de la imagen, utilice el siguiente código:

 Matrix mat = new Matrix(); mat.postRotate(90); image_to_upload = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(), myImage.getHeight(), mat, true); 

En realidad no es necesario girar mapa de bits. Es consumir memoria / lento etc .. Parece que es mejor en su caso (guardar en el archivo justo después del disparo) para actualizar las etiquetas Exif en un archivo JPEG , por ejemplo:

  int degrees = 90; ExifInterface exif = new ExifInterface(path); exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(degrees)); exif.saveAttributes(); 
  • Cómo habilitar sólo retratos y retratos en los teléfonos, "sensorPortrait" no funciona en los teléfonos?
  • Android sensorPortrait no funciona para el modo de retrato inverso
  • Imagen captada androide para estar en retrato
  • Zxing modo retrato de la cámara y el paisaje en Android
  • ¿Cómo bloqueo la orientación de la pantalla para el teléfono, pero no para la tableta? (Androide)
  • ¿Cómo puedo especificar diferentes diseños para orientaciones de retrato y de paisaje?
  • ¿Cómo configurar la aplicación para que sea sólo de retrato?
  • Orientación de vídeo de retrato de Android incorrecta en VideoView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.