Jak usunąć plik z karty SD?

131

Tworzę plik do wysłania jako załącznik do wiadomości e-mail. Teraz chcę usunąć obraz po wysłaniu wiadomości e-mail. Czy istnieje sposób na usunięcie pliku?

Próbowałem, myFile.delete();ale plik nie został usunięty.


Używam tego kodu dla Androida, więc językiem programowania jest Java przy użyciu zwykłych sposobów Androida, aby uzyskać dostęp do karty SD. Usuwam plik w onActivityResultmetodzie, gdy Intentpo wysłaniu wiadomości e-mail wraca na ekran.

błoto
źródło
Musisz podać więcej informacji o problemie, takich jak język, którego używasz, sposób uzyskiwania dostępu do karty SD itp.
Amok
czy opróżniasz zmiany na dysku?
Charles Ma
10
@Amuck Myślę, że można bezpiecznie założyć, że używa Java, ponieważ nie określił tego.
Jeremy Logan
Brzmi bardzo podejrzanie, jeśli mnie zapytasz ...
Studocwho

Odpowiedzi:

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

gdzie selectedFilePath to ścieżka do pliku, który chcesz usunąć - na przykład:

/sdcard/YourCustomDirectory/ExampleFile.mp3

Niko Gamulin
źródło
Myślę, że wewnętrzne dzieci nie są usuwane ... musisz usunąć wszystkie wewnętrzne dzieci. Zobacz moją odpowiedź poniżej ...
AndroidGeek
2
Niestety to nie zadziała na Androidzie 4.4+. Zobacz moją odpowiedź poniżej.
stevo.mit
Nie rozumiem, jak to działało dla wielu. „Usunięte” wygląda na wyszarzone w Android Studio.
TheOnlyAnil
tak, wysyłałem ścieżkę typu „file: /// storage / ...”, która nie działała
Jemshit Iskenderov
1
@ stevo.mit znalazłeś rozwiązanie? Mam również ten sam problem, nie mogę usunąć pliku z karty SD powyżej Androida 4.4+. Ale ten sam kod działający dla 4.3 /
hasnain_ahmad
79

Musisz także wyrazić zgodę, jeśli używasz> 1.6 SDK

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

w AndroidManifest.xmlpliku

neeloor2004
źródło
ale do przechowywania wymiennej karty SD potrzebujesz równieżContentResolver
użytkownik25
35

Zmiana na Androida 4.4+

Aplikacje są niedozwolone do zapisu (usuwać, modyfikować ...) do zewnętrznej pamięci masowej z wyjątkiem ich pakiet specyficznych katalogów.

Zgodnie z dokumentacją systemu Android:

„Aplikacjom nie wolno zezwalać na zapis na pomocniczych urządzeniach pamięci zewnętrznej, z wyjątkiem katalogów specyficznych dla pakietów, na które zezwalają uprawnienia zsyntetyzowane”.

Jednak istnieje nieprzyjemne obejście (patrz kod poniżej) . Testowane na Samsung Galaxy S4, ale ta poprawka nie działa na wszystkich urządzeniach. Nie liczyłbym też, że to obejście będzie dostępne w przyszłych wersjach Androida.

Jest świetny artykuł wyjaśniający (4.4+) zmianę uprawnień do pamięci zewnętrznej .

Możesz przeczytać więcej o obejściu tutaj . Kod źródłowy obejścia pochodzi z tej witryny .

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; 
   } 
}
stevo.mit
źródło
1
Nie działa dla note3. Wystąpił błąd „MediaProvider: nie można usunąć /mnt/extSdCard/test.zip”
iscariot
2
Mam niezrootowany Moto X na 4.4.4 i nie mam problemu z pisaniem do / sdcard / mydirectory
Rob
„Niestety to już nie działa w nowszych wersjach KitKata, wszystko zostało zablokowane”. Cytat z autora "ghisler (Autor)"
HendraWD
Android coraz bardziej się zamyka. Skończymy z brzydką kopią iOS !!
Phantômaxx
U mnie to się nie udaje (Android 7.1). Zawsze zwraca falsei nie usuwa pliku :-(
Spikatrix
18

Kontekst systemu Android ma następującą metodę:

public abstract boolean deleteFile (String name)

Wierzę, że zrobi to, co chcesz, z odpowiednimi założeniami aplikacji, jak wymieniono powyżej.

Yossi
źródło
3
To powinna być prawidłowa odpowiedź. context.deleteFile(filename);
Lisandro
11

Rekurencyjnie usuń wszystkie elementy podrzędne pliku ...

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

    fileOrDirectory.delete();
}
AndroidGeek
źródło
9

To działa dla mnie: (Usuń obraz z galerii)

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
Jiyeh
źródło
2
Co robi context.sendBroadcast ()?
Megaetron
Zasadniczo wysyła / rozgłasza zamiar (operację do wykonania) do wszystkich odbiorników pasujących do tej intencji. 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());
 }

Ten kod pomoże ci ... W Manifeście Androida musisz uzyskać uprawnienia do wprowadzania zmian.

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Vivek Elangovan
źródło
files [] może mieć wartość null, jeśli:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw
Myślę, że jesteście całkowicie nieświadomi, że niektóre telefony z Androidem ograniczają dostęp do zapisu na kartach SD.
4

Spróbuj tego.

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

z Apache Commons

Rahul Giradkar
źródło
1

Przepraszamy: mój kod był wcześniej błędny z powodu weryfikacji witryny.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

Myślę, że jest jasne ... Najpierw musisz znać lokalizację swojego pliku. Po drugie ,,, Environment.getExternalStorageDirectory()to metoda, która pobiera katalog aplikacji. Na koniec klasa File, która obsługuje twój plik ...

Denis IJCU
źródło
1

Miałem podobny problem z aplikacją działającą na 4.4. To, co zrobiłem, było czymś w rodzaju włamania.

Zmieniłem nazwy plików i zignorowałem je w mojej aplikacji.

to znaczy.

File sdcard = Environment.getExternalStorageDirectory();
                File from = new File(sdcard,"/ecatAgent/"+fileV);
                File to = new File(sdcard,"/ecatAgent/"+"Delete");
                from.renameTo(to);
kkm
źródło
0

To zadziałało dla mnie.

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

String my_Path = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(my_Path);
Boolean deleted = f.delete();
Denis IJCU
źródło
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
                    }
Lâm Nguyễn Tuấn
źródło
Musisz wyjaśnić swój kod! :)
Sanket Makani
Przeczytaj plik getExternalStorageDirectory + dodaj "/ Music /" to jest moja ścieżka -> mypath = / storage / sdcard / Music /. Sprawdź, czy plik istnieje lub nie istnieje i przeczytaj go. usuń, jeśli istnieje. To jest usunięcie całej listy muzyki w katalogu Muzyka
Lâm Nguyễn Tuấn
Dodaj to samo do odpowiedzi! :)
Sanket Makani
0

Możesz usunąć plik w następujący sposób:

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());
  }
}
Makvin
źródło
-1
File filedel = new File("/storage/sdcard0/Baahubali.mp3");
boolean deleted1 = filedel.delete();

Lub spróbuj tego:

String del="/storage/sdcard0/Baahubali.mp3";
File filedel2 = new File(del);
boolean deleted1 = filedel2.delete();
Laxman Ghuge
źródło
1
Oba twoje przykłady są prawie takie same. Ponadto najwyższa głosowana odpowiedź mówi dokładnie, aby to zrobić. Nie widzę, co jeszcze ta odpowiedź dodaje pytanie. Ponadto nie będzie to działać w przypadku plików w pamięci zewnętrznej (takiej jak karta SD) od Androida Kitkat i nowszych IIRC
Spikatrix,