Je suis sur 4.4.2, essayant de supprimer un fichier (image) via uri. Voici mon code:
File file = new File(uri.getPath());
boolean deleted = file.delete();
if(!deleted){
boolean deleted2 = file.getCanonicalFile().delete();
if(!deleted2){
boolean deleted3 = getApplicationContext().deleteFile(file.getName());
}
}
À l'heure actuelle, aucune de ces fonctions de suppression ne supprime réellement le fichier. J'ai aussi ceci dans mon AndroidManifest.xml:
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_INTERNAL_STORAGE" />
Pourquoi ne testez-vous pas cela avec ce code:
File fdelete = new File(uri.getPath());
if (fdelete.exists()) {
if (fdelete.delete()) {
System.out.println("file Deleted :" + uri.getPath());
} else {
System.out.println("file not Deleted :" + uri.getPath());
}
}
Je pense qu'une partie du problème est que vous n'essayez jamais de supprimer le fichier, vous continuez simplement à créer une variable qui a un appel de méthode.
Donc, dans votre cas, vous pourriez essayer:
File file = new File(uri.getPath());
file.delete();
if(file.exists()){
file.getCanonicalFile().delete();
if(file.exists()){
getApplicationContext().deleteFile(file.getName());
}
}
Cependant, je pense que c'est un peu exagéré.
Vous avez ajouté un commentaire indiquant que vous utilisez un répertoire externe plutôt qu'un uri. Au lieu de cela, vous devriez ajouter quelque chose comme:
String root = Environment.getExternalStorageDirectory().toString();
File file = new File(root + "/images/media/2918");
Ensuite, essayez de supprimer le fichier.
Essaye celui-là. Ça marche pour moi.
handler.postDelayed(new Runnable() {
@Override
public void run() {
// 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[] { imageFile.getAbsolutePath() };
// Query for the ID of the media matching the file path
Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver contentResolver = getActivity().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();
}
}, 5000);
J'ai testé ce code sur l'émulateur Nougat et cela a fonctionné:
Dans manifeste ajouter:
<application...
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="${applicationId}.provider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/provider_paths"/>
</provider>
</application>
Créez un dossier XML vide dans le dossier res et dans le chemin provider_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
<external-path name="external_files" path="."/>
</paths>
Ensuite, insérez l'extrait suivant dans votre code (par exemple, fragment):
File photoLcl = new File(homeDirectory + "/" + fileNameLcl);
Uri imageUriLcl = FileProvider.getUriForFile(getActivity(),
getActivity().getApplicationContext().getPackageName() +
".provider", photoLcl);
ContentResolver contentResolver = getActivity().getContentResolver();
contentResolver.delete(imageUriLcl, null, null);
Je vois que vous avez trouvé votre réponse, mais cela n’a pas fonctionné pour moi. Delete retournait false, j'ai donc essayé ce qui suit et cela a fonctionné (pour toute autre personne pour qui la réponse choisie ne fonctionnait pas):
System.out.println(new File(path).getAbsoluteFile().delete());
La sortie système peut être évidemment ignorée, je la pose pour faciliter la confirmation de la suppression.