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.
- Longitud y latitud del GPS de la foto geotiquetada
- Android - Get Contact Foto del número de teléfono
- Problemas para tomar fotos con Android (Cámara vertical | Retrato)
- Detectar si el contacto tiene foto
- Asegúrese de que las fotos se guardan con la misma orientación que se tomaron?
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 ???
- Android obtener ruta de la foto sin tomar foto
- Recortar la imagen ala Google Goggles
- Subir foto / foto / imagen facebook (android)
- ¿Cómo puedo agregar una imagen de contacto dentro de ContentProviderOperation?
- ¿Cómo enviar una foto a Instagram usando mi aplicación de Android?
- Datos Exif TAG_ORIENTATION siempre 0
- Android: subir fotos
- Aumentar la calidad / claridad / brillo de las fotos tomadas con la cámara android
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; }
- ¿Cómo cambiar la Actividad dinámica?
- ¿Dónde está la opción de agregar una nueva pantalla de preferencias en Android Studio 0.4.0?