2014-07-09 18 views
20

Sono al 4.4.2, cercando di cancellare un file (immagine) tramite uri. Ecco il mio codice:Come si eliminano i file a livello di programmazione su Android?

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

In questo momento, nessuna di queste funzioni di eliminazione sta effettivamente eliminando il file. Ho anche questo nel mio 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" /> 
+0

Non utilizzo getCanonicalFile(), ma solo File.delete() e funziona correttamente sul mio sistema. A meno che il tuo percorso dall'URI non sia valido. –

+0

Il mio percorso è questo: /external/images/media/2918 Sembra giusto? –

+0

... no. qualcosa come '/ mnt/sdcard/your_folder/your_file.png' fa. Tuttavia, è meglio ottenere il percorso di archiviazione tramite 'getExternalDirectory'. Infine, l'autorizzazione 'WRITE_EXTERNAL _...' include l'elemento 'READ_EXTERNAL _...'. –

risposta

55

Perché non si prova questo con questo codice:

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

Credo che parte del problema è mai cercare di eliminare il file, continui a creare una variabile che ha una chiamata al metodo.

Quindi nel tuo caso si potrebbe provare:

File file = new File(uri.getPath()); 
file.delete(); 
if(file.exists()){ 
     file.getCanonicalFile().delete(); 
     if(file.exists()){ 
      getApplicationContext().deleteFile(file.getName()); 
     } 
} 

Tuttavia penso che sia un po 'eccessivo.

Hai aggiunto un commento che stai utilizzando una directory esterna anziché un uri. Quindi, dovresti aggiungere qualcosa come:

String root = Environment.getExternalStorageDirectory().toString(); 
File file = new File(root + "/images/media/2918"); 

Quindi provare a eliminare il file.

+0

Penso che potresti essere su qualcosa. continua a dire che fdelete non esiste. Il mio percorso file è/external/images/media/2918. Sembra giusto? –

+0

Non penso che la tua soluzione funzionerà nel suo caso perché lo sta già facendo come gli hai detto di fare. – migos

+0

nessun suffisso come * .png o * .jpg? – migos

12

Prova questo. Funziona per me.

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); 
+0

funziona per me thk – Guihgo

0

Vedo che hai trovato la tua risposta, tuttavia non ha funzionato per me. Elimina mantenuto tornando falso, così ho provato quanto segue e ha funzionato (per chiunque altro, per i quali la risposta scelta non ha funzionato):

System.out.println(new File(path).getAbsoluteFile().delete()); 

il sistema fuori può essere ignorato, ovviamente, l'ho messo per comodità di conferma la cancellazione

2

Ho provato questo codice su Torrone emulatore e ha funzionato:

In manifestare aggiuntivo:

<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> 

Crea cartella xml vuoto nella cartella res e passato nel 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> 

Quindi inserisci il frammento successivo nel codice (ad esempio il frammento):

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