ne peut pas supprimer par programmation un fichier du stockage externe sous Android

J’essaie de supprimer un fichier situé sur le chemin

/storage/714D-160A/Xender/image/Screenshot_commando.png 

Ce que j’ai fait jusqu’à présent:

  try{ Ssortingng d_path = "/storage/714D-160A/Xender/image/Screenshot_commando.png"; File file = new File(d_path); file.delete(); }catch(Exception e){ e.printStackTrace(); } 

et le fichier est toujours à sa place (non supprimé :()

Aussi, j’ai donné la permission dans le fichier manifeste.

     

L’utilisation de ContentResolver pour supprimer des fichiers multimédias est incorrecte et pose de nombreux problèmes à l’utilisateur.
Vous ne pouvez pas supprimer un fichier sur la sd-card simplement en supprimant ses informations du ContentResolver sur les versions Android supérieures à Jelly Bean(4.3) .
Cela ne fonctionne que sur les versions Android antérieures à KitKat(4.4) .
C’est pourquoi l’équipe Android a fourni DocumentProvider .

Pourquoi contentResolver.delete(...) est faux?
1. Remplit la sd-card
Lorsque vous essayez de supprimer un fichier multimédia sur la sd-card par ContentResolver sur des versions supérieures à 4.3, le fichier multimédia réel restra intact, car l’ contentResolver.delete(...) ne supprime que les informations (nom, date, chemin …) des médias et vous ContentResolver par avoir des fichiers multimédias non enregistrés sur votre sd-card ce que ContentResolver n’a plus aucune idée de leur existence et c’est pourquoi vous ne pouviez pas les voir dans votre galerie et vous pensez qu’ils ont été supprimé avec cette approche tant qu’ils sont toujours là et remplissez la sd-card chaque fois que l’utilisateur tente de supprimer un fichier multimédia sur la sd-card .

2. Les fichiers multimédias (images, vidéos, gifs, etc.) reviendront dans la galerie.
Il existe de nombreuses applications, en particulier les galeries et les gestionnaires de fichiers qui trouveront ces fichiers multimédias non enregistrés et les appendont à nouveau à ContentResolver car leur comportement normal, tandis que l’utilisateur suppose que ses fichiers multimédias indésirables ont disparu. Bien sûr, aucun utilisateur ne veut supposer que des images ou des vidéos supprimées apparaissent au milieu d’une démonstration.

Alors, quelle est la bonne approche pour supprimer les fichiers multimédias sur la sd-card ?
Eh bien, cela a déjà été résolu ici avec l’utilisation de DocumentProvider .

 public static boolean delete(final Context context, final File file) { final Ssortingng where = MediaStore.MediaColumns.DATA + "=?"; final Ssortingng[] selectionArgs = new Ssortingng[] { file.getAbsolutePath() }; final ContentResolver contentResolver = context.getContentResolver(); final Uri filesUri = MediaStore.Files.getContentUri("external"); contentResolver.delete(filesUri, where, selectionArgs); if (file.exists()) { contentResolver.delete(filesUri, where, selectionArgs); } return !file.exists(); } 

Utilisez Environment.getExternalStorageDirectory().getAbsolutePath() au lieu du chemin de stockage avec codage en dur

 Ssortingng baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); File f = new File(baseDir + "/714D-160A/Xender/image/Screenshot_commando.png"); boolean d = f.delete(); 

À partir d’Android 4.4, vous ne pouvez pas écrire sur les fichiers de la carte SD (sauf dans le répertoire App) de la manière habituelle. Vous devrez utiliser Storage Access Framework en utilisant DocumentFile pour cela.

Le code suivant fonctionne pour moi:

 private void deletefile(Uri uri, Ssortingng filename) { DocumentFile pickedDir = DocumentFile.fromTreeUri(this, uri); try { getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } catch (SecurityException e) { e.printStackTrace(); } DocumentFile file = pickedDir.findFile(filename); if(file.delete()) Log.d("Log ID", "Delete successful"); else Log.d("Log ID", "Delete unsuccessful"); } 

filename est le nom du fichier à supprimer et uri est l’URI renvoyé par ACTION_OPEN_DOCUMENT_TREE :

 private void choosePath() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); intent.addCategory(Intent.CATEGORY_DEFAULT); startActivityForResult(intent, LOCATION_REQUEST); } @Override public void onActivityResult(int requestCode, int resultCode, Intent resultData) { if (requestCode == LOCATION_REQUEST && resultCode == Activity.RESULT_OK) { Uri uri; if (resultData != null) { uri = resultData.getData(); if (uri != null) { try { getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } catch (SecurityException e) { e.printStackTrace(); } /* Got the path uri */ } } } }