La orientación de la cámara de Android se inició con la intención ACTION_IMAGE_CAPTURE

Estoy trabajando en una aplicación en android que utiliza la cámara para tomar fotos. Para iniciar la cámara estoy usando un intent ACTION_IMAGE_CAPTURE como este:

 Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File image=new File(Environment.getExternalStorageDirectory(),"PhotoContest.jpg"); camera.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(image)); imageUri=Uri.fromFile(image); startActivityForResult(camera,1); public void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); switch(requestCode){ case 1: if (resultCode == Activity.RESULT_OK) { selectedImage = imageUri; getContentResolver().notifyChange(selectedImage, null); image= (ImageView) findViewById(R.id.imageview); ContentResolver cr = getContentResolver(); Bitmap bitmap; try { bitmap = android.provider.MediaStore.Images.Media .getBitmap(cr, selectedImage); image.setImageBitmap(bitmap); Toast.makeText(this, selectedImage.toString(), Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT) .show(); Log.e("Camera", e.toString()); } } else if(resultCode == Activity.RESULT_CANCELED) { Toast.makeText(EditPhoto.this, "Picture could not be taken.", Toast.LENGTH_SHORT).show(); } } } 

El problema es que todas las fotos que se toman se giran con 90 grados, alineados horizontalmente.

También he puesto esto en mi archivo de manifiesto:

  <activity android:name=".EditPhoto"> android:screenOrientation="portrait" </activity> 

Pero todavía sin resultado! ¿Así que alguien puede ayudarme ???

http://developer.android.com/reference/android/media/ExifInterface.html

http://developer.android.com/reference/android/media/ExifInterface.html#TAG_ORIENTATION

Así que si en

 Activity.onActivityResult(data, request, result) { if (request == PHOTO_REQUEST && result == RESULT_OK) { ... Uri imageUri = ... File imageFile = new File(imageUri.toString()); ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int rotate = 0; switch(orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate-=90; case ExifInterface.ORIENTATION_ROTATE_180: rotate-=90; case ExifInterface.ORIENTATION_ROTATE_90: rotate-=90; } Canvas canvas = new Canvas(bitmap); canvas.rotate(rotate); } 

¿Ayuda esto en absoluto?


Sólo para añadir a la gran respuesta de Greg, aquí está toda una "categoría" para hacer el trabajo:

 public static int neededRotation(File ff) { try { ExifInterface exif = new ExifInterface(ff.getAbsolutePath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { return 270; } if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { return 180; } if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; } return 0; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return 0; } 

Lo usarías más o menos así …

 public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE) // && resultCode == RESULT_OK ) { try { Bitmap cameraBmp = MediaStore.Images.Media.getBitmap( State.mainActivity.getContentResolver(), Uri.fromFile( Utils.tempFileForAnImage() ) ); cameraBmp = ThumbnailUtils.extractThumbnail(cameraBmp, 320,320); // NOTE incredibly useful trick for cropping/resizing square // http://stackoverflow.com/a/17733530/294884 Matrix m = new Matrix(); m.postRotate( Utils.neededRotation(Utils.tempFileForAnImage()) ); cameraBmp = Bitmap.createBitmap(cameraBmp, 0, 0, cameraBmp.getWidth(), cameraBmp.getHeight(), m, true); yourImageView.setImageBitmap(cameraBmp); // to convert to bytes... ByteArrayOutputStream baos = new ByteArrayOutputStream(); cameraBmp.compress(Bitmap.CompressFormat.JPEG, 75, baos); //or say cameraBmp.compress(Bitmap.CompressFormat.PNG, 0, baos); imageBytesRESULT = baos.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return; } } 

Espero que salve alguien escribiendo en el futuro.

La respuesta anterior es muy minuciosa, pero encontré que tenía que hacer un poco más para que cada caso funcionara, especialmente si se trata de imágenes de otras fuentes, como la Galería o Google Fotos. Aquí está mi método DetermineOrientation. Tengo una clase de la utilidad donde está situada así que tengo que pasar en la actividad para utilizar el managedQuery (que btw es deprecated así que uso cautelosamente). La razón por la que tengo que utilizar dos métodos es porque, dependiendo de la fuente de la imagen, ExifInterface no funcionará. Por ejemplo, si tomo una foto de cámara, Exif funciona bien. Sin embargo, si también estoy eligiendo imágenes de la Galería o de Google Drive, Exif no funciona y siempre devuelve 0. Espero que esto ayude a alguien.

 public static int DetermineOrientation(Activity activity, Uri fileUri) { int orientation = -1; int rotate = 0; try { ExifInterface exif = new ExifInterface(fileUri.getPath()); orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); rotate = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if(rotate == 0) { String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION}; Cursor cur = activity.managedQuery(fileUri, orientationColumn, null, null, null); orientation = -1; if (cur != null && cur.moveToFirst()) { orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0])); } if(orientation != -1) { rotate = orientation; } } return rotate; } 
  • Sube una foto a Facebook con Facebook Android SDK en Android
  • Intención de la cámara no volver a llamar a la actividad
  • Cómo guardar las fotos tomadas en una carpeta específica?
  • Android, subir una foto para alojar en imgur programatically
  • Una "Antes y Después" comparación de imágenes Slide Control en Andorid
  • ¿Cómo puedo crear efectos de fotos en Android?
  • ¿La mejor manera de ocultar una imagen en android?
  • Declarado constante para el tamaño de la foto de contacto de Android?
  • ¿Cómo tomar una foto y enviar a HTTP POST solicitud con Android?
  • ¿Cómo puedo mostrar una imagen que acabo de sacar de mi cámara en mi aplicación Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.