studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android image gallery

para - manual de programacion android pdf



Android: borrando una imagen (7)

En Kotlin puedes hacer esto:

private fun deleteImage(path: String) { val fDelete = File(path) if (fDelete.exists()) { if (fDelete.delete()) { MediaScannerConnection.scanFile(this, arrayOf(Environment.getExternalStorageDirectory().toString()), null) { path, uri -> Log.d("debug", "DONE") } } } }

Estoy eliminando un archivo de imagen de mi aplicación. estaba haciendo

new File(filename).delete ();

Esto fue realmente eliminar el archivo. Pero la imagen seguía siendo visible en la galería.

En la búsqueda encontré que deberíamos usar

getContentResolver().delete(Uri.fromFile(file), null,null); borrar

Pero aquí estoy obteniendo la excepción:

URL del archivo desconocido. java.lang.IllegalArgumentException: Archivo URL desconocido: ///mnt/sdcard/DCIM/Camera/IMG_20120523_122612.jpg

Cuando veo con cualquier navegador de archivos, esta imagen en particular está presente. Por favor, ayúdame a solucionar este problema. ¿Hay alguna otra manera de actualizar la galería cuando la imagen se elimina físicamente?


He visto muchas respuestas que sugieren el uso de

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));

Esto funciona pero hace que el Escáner de medios vuelva a escanear los medios en el dispositivo. Un enfoque más eficiente sería consultar / eliminar a través del proveedor de contenido de Media Store:

// Set up the projection (we only need the ID) String[] projection = { MediaStore.Images.Media._ID }; // Match on the file path String selection = MediaStore.Images.Media.DATA + " = ?"; String[] selectionArgs = new String[] { file.getAbsolutePath() }; // Query for the ID of the media matching the file path Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; ContentResolver contentResolver = getContentResolver(); Cursor c = contentResolver.query(queryUri, projection, selection, selectionArgs, null); if (c.moveToFirst()) { // We found the ID. Deleting the item via the content provider will also remove the file long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Images.Media._ID)); Uri deleteUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); contentResolver.delete(deleteUri, null, null); } else { // File not found in media store DB } c.close();


Para borrar la imagen,

ContentResolver contentResolver = getContentResolver(); contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.ImageColumns.DATA + "=?" , new String[]{ imagePath });


Probé todas esas soluciones pero no tuve suerte en Android 6.
Al final, encontré este fragmento de código que funcionó bien.

public static void deleteFileFromMediaStore(final ContentResolver contentResolver, final File file) { String canonicalPath; try { canonicalPath = file.getCanonicalPath(); } catch (IOException e) { canonicalPath = file.getAbsolutePath(); } final Uri uri = MediaStore.Files.getContentUri("external"); final int result = contentResolver.delete(uri, MediaStore.Files.FileColumns.DATA + "=?", new String[]{canonicalPath}); if (result == 0) { final String absolutePath = file.getAbsolutePath(); if (!absolutePath.equals(canonicalPath)) { contentResolver.delete(uri, MediaStore.Files.FileColumns.DATA + "=?", new String[]{absolutePath}); } } }

También probé esto en Android 4.4 y 5.1 y funciona perfectamente.


Usa el código de abajo, puede ayudarte.

File fdelete = new File(file_dj_path); if (fdelete.exists()) { if (fdelete.delete()) { System.out.println("file Deleted :" + file_dj_path); } else { System.out.println("file not Deleted :" + file_dj_path); } }

para actualizar la galería después de eliminar la imagen, utilice el siguiente código para enviar Transmisión

(para <KITKAT API 14)

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));

Para> = KITKAT API 14 usar código debajo

MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { /* * (non-Javadoc) * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri) */ public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } });

Porque:

ACTION_MEDIA_MOUNTED

está en desuso en KITKAT (API 14).

EDITADO 04-09-2015

está funcionando bien verifique el código siguiente

public void deleteImage() { String file_dj_path = Environment.getExternalStorageDirectory() + "/ECP_Screenshots/abc.jpg"; File fdelete = new File(file_dj_path); if (fdelete.exists()) { if (fdelete.delete()) { Log.e("-->", "file Deleted :" + file_dj_path); callBroadCast(); } else { Log.e("-->", "file not Deleted :" + file_dj_path); } } } public void callBroadCast() { if (Build.VERSION.SDK_INT >= 14) { Log.e("-->", " >= 14"); MediaScannerConnection.scanFile(this, new String[]{Environment.getExternalStorageDirectory().toString()}, null, new MediaScannerConnection.OnScanCompletedListener() { /* * (non-Javadoc) * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri) */ public void onScanCompleted(String path, Uri uri) { Log.e("ExternalStorage", "Scanned " + path + ":"); Log.e("ExternalStorage", "-> uri=" + uri); } }); } else { Log.e("-->", " < 14"); sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); } }

debajo hay registros

09-04 14:27:11.085 8290-8290/com.example.sampleforwear E/-->﹕ file Deleted :/storage/emulated/0/ECP_Screenshots/abc.jpg 09-04 14:27:11.085 8290-8290/com.example.sampleforwear E/-->﹕ >= 14 09-04 14:27:11.152 8290-8290/com.example.sampleforwear E/﹕ appName=com.example.sampleforwear, acAppName=/system/bin/surfaceflinger 09-04 14:27:11.152 8290-8290/com.example.sampleforwear E/﹕ 0 09-04 14:27:15.249 8290-8302/com.example.sampleforwear E/ExternalStorage﹕ Scanned /storage/emulated/0: 09-04 14:27:15.249 8290-8302/com.example.sampleforwear E/ExternalStorage﹕ -> uri=content://media/external/file/2416


File file = new File(photoUri); file.delete(); context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoUri))));

Este código me funciona y creo que es mejor que volver a montar la tarjeta SD completa con Intent.ACTION_MEDIA_MOUNTED


sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));

Este código funciona, pero es muy costoso. Desmonta y luego monta la tarjeta SD, lo que puede afectar a algunas aplicaciones o tomar enormes recursos del sistema para actualizar la galería. Todavía estoy buscando una mejor alternativa y publicaré si recibo una.