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
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
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();
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
Pour supprimer une image,
ContentResolver contentResolver = getContentResolver();
contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.ImageColumns.DATA + "=?" , new String[]{ imagePath });
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.
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.
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!
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")
}
}
}
}