visor una studio seleccionar manejo imagenes imagen guardar galeria desde cargar camara android android-camera-intent

android - una - La intención de la cámara no es guardar la foto



seleccionar imagen de galeria android studio (2)

He utilizado con éxito este fragmento de código anteriormente, pero con el archivo apuntando a algún lugar en la tarjeta SD.

final File temp = new File(getCacheDir(), "temp.jpg"); temp.delete(); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(temp)); startActivityForResult(intent, CONFIG.Intents.Actions.SELECT_CAMERA_PHOTO);

Sin embargo, cuando uso getCacheDir en lugar de una ubicación en la tarjeta SD, parece que la foto nunca se guarda. ¿Es esta una limitación de dir caché y captura de imágenes?


La mejor solución que encontré es: FileProvider (necesita support-library-v4)
Utiliza el almacenamiento interno! https://developer.android.com/reference/android/support/v4/content/FileProvider.html

  1. Defina su FileProvider en el elemento Manifest in Application:

    <provider android:name="android.support.v4.content.FileProvider" android:authorities="your.package.name.fileprovider" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/image_path" /> </provider>

  2. Agregue la función de la cámara al elemento raíz de AndroidManifest.xml si es obligatorio:

    <uses-feature android:name="android.hardware.camera" android:required="true" />

  3. Defina sus rutas de imagen en, por ejemplo, res / xml / image_path.xml:

    <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="captured_image" path="your/path/"/> </paths>

  4. Java:

    private static final int IMAGE_REQUEST_CODE = 1; // your authority, must be the same as in your manifest file private static final String CAPTURE_IMAGE_FILE_PROVIDER = "your.package.name.fileprovider";

4.1 intento de captura:

File path = new File(activity.getFilesDir(), "your/path"); if (!path.exists()) path.mkdirs(); File image = new File(path, "image.jpg"); Uri imageUri = FileProvider.getUriForFile(activity, CAPTURE_IMAGE_FILE_PROVIDER, image); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, IMAGE_REQUEST_CODE);

4.2 onActivityResult ():

@Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == IMAGE_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { File path = new File(getFilesDir(), "your/path"); if (!path.exists()) path.mkdirs(); File imageFile = new File(path, "image.jpg"); // use imageFile to open your image } } super.onActivityResult(requestCode, resultCode, intent); }


Técnicamente, esto se debe a que no se admite la escritura en el almacenamiento interno cuando se utiliza la aplicación Cámara para capturar una imagen. De hecho, puede notar una excepción impresa en logcat que indica Writing to internal storage is not supported . Sin embargo, la verdadera razón por la que esto no funciona es porque, de manera predeterminada, está creando un archivo que es privado para su paquete de aplicaciones y otra aplicación (es decir, la aplicación de la cámara) no puede acceder a esa ubicación del archivo porque no tiene permiso para hacerlo. hazlo El almacenamiento externo es la única parte globalmente accesible del sistema de archivos.

La solución es que usted cree el archivo con permisos globales (WORLD_WRITEABLE). Por lo general, esto permite que la aplicación de la Cámara acceda al archivo a través del Uri pasado. Realmente no hay métodos para hacer esto directamente en el File , por lo que tiene que crear el archivo utilizando los métodos disponibles en Context y luego agarrar un identificador:

//Remove if exists, the file MUST be created using the lines below File f = new File(getFilesDir(), "Captured.jpg"); f.delete(); //Create new file FileOutputStream fos = openFileOutput("Captured.jpg", Context.MODE_WORLD_WRITEABLE); fos.close(); //Get reference to the file File f = new File(getFilesDir(), "Captured.jpg");

Esto también limita el lugar donde puede colocar el archivo, ya que los métodos de Context crean archivos de forma inherente en el directorio de "archivos" de la raíz, y no puede redirigirlo al directorio de la caché.

HTH