La cámara no funciona / ahorra al usar Uri de caché como MediaStore.EXTRA_OUTPUT

Estoy tratando de obtener la imagen completa después de tomar una foto de un Fragment .

Si utilizo el Uri del archivo ( Uri.fromFile(file) ), la cámara no saldrá después de tomar la foto y pulsando en el botón 'ok' (parece que no se puede escribir al Uri o quién sabe qué) .

Usando la String File , en forma de '/data/data/com.package.bla/cache/img198346262jpg' , no funciona tan bien (el archivo está allí, pero está vacío porque la cámara no está guardando nada en él) .

Lo que he intentado hasta ahora:

  • Borrar el archivo después de crearlo, como hace este ejemplo . Sin embargo, el archivo no existe después de salir de la cámara.
  • Se agregó permiso de lectura de almacenamiento externo, por si acaso

Así que no tengo idea de por qué la imagen no se está guardando y ya gastado / desperdiciado un montón de pruebas de tiempo y calcular por qué no funciona.

Fragmento:

 private void launchCamera() { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); File outputDir = getActivity().getCacheDir(); File file = null; try { file = File.createTempFile("img", "jpg", outputDir); } catch (IOException e) { e.printStackTrace(); } if (file != null) { mImageUri = Uri.fromFile(file); //using Uri is not even exiting the camera //mImageUri = File.toString(); //If I use String instead of an Uri, it works better (ie, can accept camera photo) cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(cameraIntent, RESULT_TAKE_IMAGE); } } public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { Bitmap original = BitmapFactory.decodeFile(mImageUri.toString(), bounds); } } 

Código editado, mImageUri. Como se explica, si utilizo Uri no puedo ni siquiera aceptar la foto en la aplicación de cámara. El uso de una cadena me permitirá aceptar la foto, aunque la foto no se guarda realmente (es decir, el archivo tiene 0 bytes dentro de él).

EXPLICACIÓN : El problema estaba relacionado con guardar en el directorio de caché. Tal vez es un error, me falta un permiso o la aplicación de cámara no puede guardar en su directorio de datos privados de la aplicación. Añadir permiso FLAG_GRANT_WRITE_URI_PERMISSION no lo resolvió. Publicaciones relacionadas: Almacene la imagen de la cámara en el directorio de la caché de la aplicación privada Y Guardando los datos de la cámara en la caché cuando se inicie mediante la intención

UPDATE Desde Android 2.2 en adelante se puede utilizar el método getExternalCacheDir() lugar de getCacheDir()

2 Solutions collect form web for “La cámara no funciona / ahorra al usar Uri de caché como MediaStore.EXTRA_OUTPUT”

¿Por qué no guardarlo en un nuevo archivo?

  final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator); root.mkdirs(); final String fname = "img_"+ System.currentTimeMillis() + ".jpg"; final File sdImageMainDirectory = new File(root, fname); mImageUri = Uri.fromFile(sdImageMainDirectory); 

Y luego pasar ese uri a la intención

  cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); 

Pruebe esto funciona como un encanto conmigo

 private String selectedImagePath = ""; final private int PICK_IMAGE = 1; final private int CAPTURE_IMAGE = 2; public Uri setImageUri() { // Store image in dcim File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".png"); Uri imgUri = Uri.fromFile(file); this.imgPath = file.getAbsolutePath(); return imgUri; } public String getImagePath() { return imgPath; } btnGallery.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE); } }); btnCapture.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri()); startActivityForResult(intent, CAPTURE_IMAGE); } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_CANCELED) { if (requestCode == PICK_IMAGE) { selectedImagePath = getAbsolutePath(data.getData()); imgUser.setImageBitmap(decodeFile(selectedImagePath)); } else if (requestCode == CAPTURE_IMAGE) { selectedImagePath = getImagePath(); imgUser.setImageBitmap(decodeFile(selectedImagePath)); } else { super.onActivityResult(requestCode, resultCode, data); } } } public Bitmap decodeFile(String path) { try { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, o); // The new size we want to scale to final int REQUIRED_SIZE = 70; // Find the correct scale value. It should be the power of 2. int scale = 1; while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE) scale *= 2; // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeFile(path, o2); } catch (Throwable e) { e.printStackTrace(); } return null; } public String getAbsolutePath(Uri uri) { String[] projection = { MediaColumns.DATA }; @SuppressWarnings("deprecation") Cursor cursor = managedQuery(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } else return null; } 
  • Leer un archivo pdf desde la carpeta de activos
  • Cómo obtener la selección de usuario de startActivityForResult (Intent.createChooser (fileIntent, "Abrir archivo utilizando ..."), APP_PICKED) ;?
  • BroadcastReceiver onReceive () no llamado cuando se registra dinámicamente
  • Definir categoría de intentos mediante programación
  • Android Cómo pasar LinkedHashMap entre las actividades?
  • ¿Por qué estoy recibiendo el error "MyActivity no es una clase inclusiva?"
  • Terminar una llamada entrante mediante programación en android
  • Conexión profunda de Android a una aplicación
  • Intención de filtro basada en datos personalizados
  • Android "Tratar de pausar cuando la pausa ya está pendiente"
  • ¿Debo usar vnd.youtube:videoID?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.