Как удалить файл с SD-карты?
Я создаю файл для отправки в качестве вложения в сообщение электронной почты. Теперь я хочу удалить изображение после отправки по электронной почте. Есть ли способ удалить файл?
Я пробовал myFile.delete();
но он не удалил файл.
Я использую этот код для Android, поэтому язык программирования Java использует обычные способы Android для доступа к SD-карте. Я удаляю файл в onActivityResult
метод, когда Intent
возвращается на экран после отправки электронная почта.
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"/>
извините: есть ошибка в моем коде раньше из-за проверки сайта.
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 }