web-dev-qa-db-fra.com

Comment supprimer des fichiers par programme sur Android?

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" />
40
Randall Stephens

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.

85
Shawnic Hedgehog

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);
14
Krishna

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

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.

4
Arijit