Как удалить файл с SD-карты? - PullRequest
       113

Как удалить файл с SD-карты?

128 голосов
/ 08 августа 2009

Я создаю файл для отправки в виде вложения в электронное письмо. Теперь я хочу удалить изображение после отправки электронного письма. Есть ли способ удалить файл?

Я пробовал myFile.delete();, но файл не был удален.


Я использую этот код для Android, поэтому язык программирования - Java, использующий обычные для Android способы доступа к SD-карте. Я удаляю файл методом onActivityResult, когда Intent возвращается на экран после отправки электронного письма.

Ответы [ 14 ]

356 голосов
/ 10 августа 2009
File file = new File(selectedFilePath);
boolean deleted = file.delete();

где selectedFilePath - путь к файлу, который вы хотите удалить - например:

/ SDCard / YourCustomDirectory / ExampleFile.mp3

78 голосов
/ 10 июня 2010

Также вы должны дать разрешение, если вы используете> 1.6 SDK

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

в AndroidManifest.xml файле

33 голосов
/ 20 мая 2014

Изменение для Android 4.4 +

Приложения не разрешены до запись (удаление, изменение ...) до внешние память за исключением в их директории для конкретного пакета.

Как указано в документации Android:

"Приложениям не должно разрешаться запись во вторичное внешнее хранилище устройства, кроме как в их специфичных для пакета каталогах как разрешено синтезированные разрешения. "

Однако неприятный обходной путь существует (см. Код ниже) . Протестировано на Samsung Galaxy S4, но это исправление работает не на всех устройствах. Кроме того, я не буду рассчитывать на этот обходной путь, доступный в будущих версиях Android.

Существует отличная статья, объясняющая (4.4+) изменение разрешений на внешнее хранилище .

Подробнее об обходе можно прочитать здесь . Обходной код с этого сайта .

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; 
   } 
}
17 голосов
/ 30 декабря 2010

Android-контекст имеет следующий метод:

public abstract boolean deleteFile (String name)

Я считаю, что это будет делать то, что вы хотите с правильными настройками приложения, как указано выше.

11 голосов
/ 15 мая 2014

Рекурсивно удалить все дочерние элементы файла ...

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

        fileOrDirectory.delete();
    }
9 голосов
/ 16 сентября 2015

Это работает для меня: (Удалить изображение из галереи)

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
6 голосов
/ 07 апреля 2014
 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());
 }

Этот код поможет вам .. И в манифесте Android Вы должны получить разрешение на внесение изменений ..

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4 голосов
/ 27 июля 2016

Попробуйте это.

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

от Apache Commons

1 голос
/ 14 января 2016

У меня была похожая проблема с приложением, работающим на 4.4. То, что я сделал, было чем-то вроде взлома.

Я переименовал файлы и проигнорировал их в своем приложении.

есть.

File sdcard = Environment.getExternalStorageDirectory();
                File from = new File(sdcard,"/ecatAgent/"+fileV);
                File to = new File(sdcard,"/ecatAgent/"+"Delete");
                from.renameTo(to);
1 голос
/ 02 ноября 2015

Извините: в моем коде ранее была ошибка из-за проверки сайта.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

думаю понятно ... Сначала вы должны знать местоположение вашего файла. Второй ,,, Environment.getExternalStorageDirectory() - это метод, который получает каталог вашего приложения. Наконец, класс File, который обрабатывает ваш файл ...

...