web-dev-qa-db-fra.com

android: suppression d'une image

Je supprime un fichier image de mon application. je faisais 

new  File(filename).delete ();

C'était en train de supprimer le fichier. Mais l'image était toujours visible dans la galerie.

À la recherche, j'ai trouvé que nous devrions utiliser 

getContentResolver().delete(Uri.fromFile(file), null,null); à supprimer

Mais ici je reçois l'exception:

URL de fichier inconnue. Java.lang.IllegalArgumentException: URL inconnue fichier: ///mnt/sdcard/DCIM/Camera/IMG_20120523_122612.jpg

Quand je vois avec n'importe quel navigateur de fichiers, cette image particulière est présente. S'il vous plaît aidez-moi à résoudre ce problème. Y a-t-il un autre moyen de mettre à jour la galerie lorsque l'image est physiquement supprimée

28
png

Utilisez le code ci-dessous, cela peut vous aider.

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);
    }
}

pour actualiser la galerie après la suppression de l'image, utilisez le code ci-dessous pour envoyer la diffusion

(pour <KitKat API 14)

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

Pour> = KitKat API 14, utilisez le code ci-dessous.

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);
              }
            });

Parce que: 

ACTION_MEDIA_MOUNTED

est obsolète dans KitKat (API 14).


MODIFIÉ 04-09-2015  

son bon travail vérifier ci-dessous le code

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())));
        }
    }

ci-dessous est des journaux

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
26

J'ai vu beaucoup de réponses suggérant l'utilisation de

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

Cela fonctionne mais l’analyseur de supports analyse à nouveau le support sur le périphérique. Une approche plus efficace consisterait à interroger/supprimer via le fournisseur de contenu 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();
33
Tanner Perrien
File file = new File(photoUri);
file.delete();

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

Ce code fonctionne pour moi et je pense que c'est mieux que de remonter toute la carte SD avec Intent.ACTION_MEDIA_MOUNTED

22
Cody

Pour supprimer une image,

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

J'ai essayé toutes ces solutions mais je n'ai pas eu de chance avec Android 6.
.__ En fin de compte, j'ai trouvé cette partie de code qui fonctionnait 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});
        }
    }
}

J'ai également testé cela dans Android 4.4 et 5.1 et cela fonctionne parfaitement.

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

Ce code fonctionne, mais coûte très cher en ressources. La carte SD se démonte et se monte, ce qui peut affecter certaines applications ou mobiliser d’énormes ressources système pour actualiser la galerie. Je suis toujours à la recherche d'une meilleure alternative et publierai si j'en ai une.

4
Rajiv

J'avais le même problème et j'ai essayé trois méthodes différentes pour supprimer une image. Parfois cela fonctionnait parfois non. Après trop de temps passé maintenant, chaque méthode que je possède va supprimer l’image. Ce que je veux dire, c’est: SOYEZ PRUDENT AVEC LE TRAITEMENT EN BITMAP . Je prenais une photo, persistez-la et faites-la pivoter si nécessaire: 

public static Bitmap rotatePictureToPortraitMode(String filePath, Bitmap myBitmap) {
try {
    ExifInterface exif = new ExifInterface(filePath);
    int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
    Log.d("EXIF", "Exif: " + orientation);
    Matrix matrix = new Matrix();
    if (orientation == 6) {
        matrix.postRotate(90);
    } else if (orientation == 3) {
        matrix.postRotate(180);
    } else if (orientation == 8) {
        matrix.postRotate(270);
    }
    myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true); // rotating bitmap
} catch (Exception e) {

}
return myBitmap;
}

après cela, j'ai essayé de supprimer l'image, mais comme je l'ai dit précédemment, cela ne fonctionnait pas. Supprimer cette méthode m'a aidé à résoudre le problème.

C’était peut-être uniquement mon problème, mais dès que j’ai supprimé cette option, cela m’a beaucoup aidé. Je tiens donc à préciser le traitement que vous donnez à l’image. Pour mon cas, j'ai utilisé la réponse mentionnée précédemment:

File file = new File(photoUri);
file.delete();

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

J'espère que ça aide!

0
f.trajkovski

Dans Kotlin, vous pouvez faire ceci:

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")
            }
        } 
    }
}
0
Jéwôm'