Come eliminare un file dalla scheda SD?


131

Sto creando un file da inviare come allegato a un'e-mail. Ora voglio eliminare l'immagine dopo aver inviato l'e-mail. C'è un modo per eliminare il file?

Ho provato myFile.delete();ma non ha eliminato il file.


Sto usando questo codice per Android, quindi il linguaggio di programmazione è Java usando i soliti modi Android per accedere alla scheda SD. Sto eliminando il file nel onActivityResultmetodo, quando Intentviene restituito allo schermo dopo aver inviato un'e-mail.


Devi fornire ulteriori informazioni sul problema, come la lingua che stai utilizzando, il modo in cui accedi alla scheda SD, ecc.
Amok

stai scaricando le modifiche su disco?
Charles Ma

10
@Amuck Penso che sia sicuro supporre che stia usando Java poiché non ha specificato.
Jeremy Logan,

Sembra molto sospetto se me lo chiedi ...
Studocwho,

Risposte:


359
File file = new File(selectedFilePath);
boolean deleted = file.delete();

dove selectedFilePath è il percorso del file che si desidera eliminare, ad esempio:

/sdcard/YourCustomDirectory/ExampleFile.mp3


Penso che i bambini interiori non vengano cancellati .. devi cancellare tutti i bambini interiori. Vedi la mia risposta qui sotto ..
Zar E Ahmer,

2
Purtroppo questo non funzionerà su Android 4.4+. Vedi la mia risposta qui sotto.
stevo.mit,

Non capisco come ha funzionato per molti. "eliminato" appare in grigio in Android Studio.
TheOnlyAnil

sì, stavo inviando un percorso come "file: /// storage / ..." che non funzionava
Jemshit Iskenderov

1
@ stevo.mit hai trovato la soluzione? Sto anche affrontando lo stesso problema non riesco a eliminare il file da SDcard sopra Android 4.4+. Ma lo stesso codice funziona per 4.3 /
hasnain_ahmad il

79

Inoltre devi dare il permesso se stai usando> 1.6 SDK

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

nel AndroidManifest.xmlfile


ma per l' archiviazione su scheda SD rimovibile è necessario ancheContentResolver
user25

35

Modifica per Android 4.4+

Le app non sono autorizzate a scrivere (eliminare, modificare ...) su un archivio esterno ad eccezione delle loro directory specifiche del pacchetto .

Come afferma la documentazione Android:

"Le app non devono poter scrivere su dispositivi di archiviazione esterni secondari, tranne nelle loro directory specifiche del pacchetto come consentito dalle autorizzazioni sintetizzate."

Tuttavia esiste una brutta soluzione (vedi codice sotto) . Testato su Samsung Galaxy S4, ma questa correzione non funziona su tutti i dispositivi. Inoltre, non vorrei contare su questa soluzione alternativa disponibile nelle future versioni di Android.

C'è un ottimo articolo che spiega (4.4+) il cambiamento delle autorizzazioni di archiviazione esterna .

Puoi leggere di più sulla soluzione alternativa qui . Il codice sorgente della soluzione alternativa proviene da questo sito .

public class MediaFileFunctions 
{
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static boolean deleteViaContentProvider(Context context, String fullname) 
    { 
      Uri uri=getFileUri(context,fullname); 

      if (uri==null) 
      {
         return false;
      }

      try 
      { 
         ContentResolver resolver=context.getContentResolver(); 

         // change type to image, otherwise nothing will be deleted 
         ContentValues contentValues = new ContentValues(); 
         int media_type = 1; 
         contentValues.put("media_type", media_type); 
         resolver.update(uri, contentValues, null, null); 

         return resolver.delete(uri, null, null) > 0; 
      } 
      catch (Throwable e) 
      { 
         return false; 
      } 
   }

   @TargetApi(Build.VERSION_CODES.HONEYCOMB)
   private static Uri getFileUri(Context context, String fullname) 
   {
      // Note: check outside this class whether the OS version is >= 11 
      Uri uri = null; 
      Cursor cursor = null; 
      ContentResolver contentResolver = null;

      try
      { 
         contentResolver=context.getContentResolver(); 
         if (contentResolver == null)
            return null;

         uri=MediaStore.Files.getContentUri("external"); 
         String[] projection = new String[2]; 
         projection[0] = "_id"; 
         projection[1] = "_data"; 
         String selection = "_data = ? ";    // this avoids SQL injection 
         String[] selectionParams = new String[1]; 
         selectionParams[0] = fullname; 
         String sortOrder = "_id"; 
         cursor=contentResolver.query(uri, projection, selection, selectionParams, sortOrder); 

         if (cursor!=null) 
         { 
            try 
            { 
               if (cursor.getCount() > 0) // file present! 
               {   
                  cursor.moveToFirst(); 
                  int dataColumn=cursor.getColumnIndex("_data"); 
                  String s = cursor.getString(dataColumn); 
                  if (!s.equals(fullname)) 
                     return null; 
                  int idColumn = cursor.getColumnIndex("_id"); 
                  long id = cursor.getLong(idColumn); 
                  uri= MediaStore.Files.getContentUri("external",id); 
               } 
               else // file isn't in the media database! 
               {   
                  ContentValues contentValues=new ContentValues(); 
                  contentValues.put("_data",fullname); 
                  uri = MediaStore.Files.getContentUri("external"); 
                  uri = contentResolver.insert(uri,contentValues); 
               } 
            } 
            catch (Throwable e) 
            { 
               uri = null; 
            }
            finally
            {
                cursor.close();
            }
         } 
      } 
      catch (Throwable e) 
      { 
         uri=null; 
      } 
      return uri; 
   } 
}

1
Non funziona per note3. Ho ricevuto l'errore "MediaProvider: impossibile eliminare /mnt/extSdCard/test.zip"
iscariot

2
Ho una Moto X non rootata su 4.4.4 e non ho problemi a scrivere su / sdcard / mydirectory
Rob

"Purtroppo non funziona più con le versioni più recenti di Kitkat, è stato tutto bloccato." citato dall'autore "ghisler (Autore)"
HendraWD il

Android si sta chiudendo sempre di più. Finiremo con una brutta copia di iOS !!
Phantômaxx,

Questo non funziona per me (Android 7.1). Restituisce sempre falsee non cancella il file :-(
Spikatrix

18

Android Context ha il seguente metodo:

public abstract boolean deleteFile (String name)

Credo che questo farà quello che vuoi con le giuste premesse per le app elencate sopra.


3
Questa dovrebbe essere la risposta corretta. context.deleteFile(filename);
Lisandro,

11

Elimina ricorsivamente tutti i figli del file ...

public static void DeleteRecursive(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory()) {
        for (File child : fileOrDirectory.listFiles()) {
            DeleteRecursive(child);
        }
    }

    fileOrDirectory.delete();
}

9

Questo funziona per me: (Elimina immagine dalla Galleria)

File file = new File(photoPath);
file.delete();

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));

2
Che cosa fa context.sendBroadcast ()?
Megaetron,

Fondamentalmente, invia / trasmette l'intento (operazione da eseguire) a tutti i ricevitori che corrispondono a questo intento. link
Jiyeh,

6
 public static boolean deleteDirectory(File path) {
    // TODO Auto-generated method stub
    if( path.exists() ) {
        File[] files = path.listFiles();
        for(int i=0; i<files.length; i++) {
            if(files[i].isDirectory()) {
                deleteDirectory(files[i]);
            }
            else {
                files[i].delete();
            }
        }
    }
    return(path.delete());
 }

Questo codice ti aiuterà .. E in Android Manifest devi ottenere l'autorizzazione per apportare modifiche ..

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

i file [] possono essere nulli se:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw

Suppongo che voi ragazzi sia del tutto inconsapevole del fatto che alcuni telefoni Android limitano l'accesso in scrittura alle schede SD.

4

Prova questo.

File file = new File(FilePath);
FileUtils.deleteDirectory(file);

da Apache Commons


1

Siamo spiacenti: c'è stato un errore nel mio codice prima a causa della convalida del sito.

String myFile = "/Name Folder/File.jpg";  

String myPath = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(myPath);
Boolean deleted = f.delete();

Penso che sia chiaro ... Per prima cosa devi conoscere la posizione del tuo file. Il secondo ,,, Environment.getExternalStorageDirectory()è un metodo che ottiene la directory dell'app. Infine il file di classe che gestisce il tuo file ...


1

Ho avuto un problema simile con un'applicazione in esecuzione su 4.4. Quello che ho fatto è stato una specie di hack.

Ho rinominato i file e li ho ignorati nella mia applicazione.

vale a dire.

File sdcard = Environment.getExternalStorageDirectory();
                File from = new File(sdcard,"/ecatAgent/"+fileV);
                File to = new File(sdcard,"/ecatAgent/"+"Delete");
                from.renameTo(to);

0

Questo ha funzionato per me.

String myFile = "/Name Folder/File.jpg";  

String my_Path = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(my_Path);
Boolean deleted = f.delete();

0
private boolean deleteFromExternalStorage(File file) {
                        String fileName = "/Music/";
                        String myPath= Environment.getExternalStorageDirectory().getAbsolutePath() + fileName;

                        file = new File(myPath);
                        System.out.println("fullPath - " + myPath);
                            if (file.exists() && file.canRead()) {
                                System.out.println(" Test - ");
                                file.delete();
                                return false; // File exists
                            }
                            System.out.println(" Test2 - ");
                            return true; // File not exists
                    }

Devi fornire alcune spiegazioni sul tuo codice! :)
Sanket Makani,

Leggi il file getExternalStorageDirectory + aggiungi "/ Music /" è il mio percorso -> mypath = / storage / sdcard / Music /. Controlla che il file esista o non esista e leggilo. cancellare se esiste. Questo è cancellare tutta la musica della lista nella directory Music
Lâm Nguyễn Tuấn,

Aggiungi lo stesso alla risposta! :)
Sanket Makani,

0

È possibile eliminare un file come segue:

File file = new File("your sdcard path is here which you want to delete");
file.delete();
if (file.exists()){
  file.getCanonicalFile().delete();
  if (file.exists()){
    deleteFile(file.getName());
  }
}

-1
File filedel = new File("/storage/sdcard0/Baahubali.mp3");
boolean deleted1 = filedel.delete();

Oppure, prova questo:

String del="/storage/sdcard0/Baahubali.mp3";
File filedel2 = new File(del);
boolean deleted1 = filedel2.delete();

1
Entrambi i tuoi esempi sono praticamente gli stessi. Inoltre, la risposta più votata dice esattamente di fare questo. Non riesco a vedere di più questa risposta aggiunge la domanda. Inoltre, questo non funzionerà per i file in una memoria esterna (come la scheda SD) da Android Kitkat in poi IIRC
Spikatrix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.