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


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

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


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

14 127

14 ответов:

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

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

/sdcard / YourCustomDirectory / ExampleFile. mp3

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

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

на AndroidManifest.xml file

изменить для 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; 
   } 
}

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

public abstract boolean deleteFile (String name)

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

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

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

        fileOrDirectory.delete();
    }

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

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
 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 Manifest вы должны получить разрешение на внесение изменений..

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

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

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

от Apache Commons

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

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

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

У меня была аналогичная проблема с приложением, запущенным на 4.4. Что я сделал, было своего рода Хак.

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

ie.

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

это сработало для меня.

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

String my_Path = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(my_Path);
Boolean deleted = f.delete();
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
                    }

вы можете удалить файл следующим образом:

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());
  }
}
File filedel = new File("/storage/sdcard0/Baahubali.mp3");
boolean deleted1 = filedel.delete();

Или, Попробуйте Это:

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