我正在创建一个要作为电子邮件附件发送的文件。现在我想在发送电子邮件后删除图像。有没有办法删除文件?
我尝试了myFile.delete();
,但没有删除该文件。
我正在使用Android的这个代码,因此编程语言是使用通常的Android方式访问SD卡的Java。我在发送电子邮件后将onActivityResult
返回到屏幕时,使用Intent
方法删除该文件。
答案 0 :(得分:356)
File file = new File(selectedFilePath);
boolean deleted = file.delete();
其中selectedFilePath是您要删除的文件的路径 - 例如:
/sdcard/YourCustomDirectory/ExampleFile.mp3
答案 1 :(得分:79)
如果您使用的是> 1.6 SDK
,则必须同意uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
<{1>}文件中的
答案 2 :(得分:33)
应用不允许 写 (删除,修改...)到外部存储 到特定于程序包的目录。
正如Android文档所述:
“不得允许应用程序写入辅助外部存储 设备,除了允许的特定于包的目录 合成权限。“
但讨厌的解决方法存在(请参阅下面的代码)。在三星Galaxy S4上测试过,但此修复程序无法在所有设备上运行。此外,不会指望此解决方法可用于未来版本的Android。
有great article explaining (4.4+) external storage permissions change。
您可以阅读more about workaround here。 解决方法源代码来自this site。
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;
}
}
答案 3 :(得分:17)
Android Context有以下方法:
public abstract boolean deleteFile (String name)
我相信这可以通过上面列出的正确的应用程序预备做到你想要的。
答案 4 :(得分:11)
递归删除文件的所有子项......
public static void DeleteRecursive(File fileOrDirectory)
{
if (fileOrDirectory.isDirectory())
{
for (File child : fileOrDirectory.listFiles())
{
DeleteRecursive(child);
}
}
fileOrDirectory.delete();
}
答案 5 :(得分:9)
这对我有用:(从图库中删除图像)
File file = new File(photoPath);
file.delete();
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
答案 6 :(得分: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());
}
此代码将帮助您..并且在Android Manifest中您必须获得修改权限..
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
答案 7 :(得分:4)
试试这个。
File file = new File(FilePath);
FileUtils.deleteDirectory(file);
来自Apache Commons
答案 8 :(得分:1)
抱歉:由于网站验证,我的代码中存在错误。
String myFile = "/Name Folder/File.jpg";
String myPath = Environment.getExternalStorageDirectory()+myFile;
File f = new File(myPath);
Boolean deleted = f.delete();
我觉得很清楚......
首先,您必须知道您的文件位置。
第二个,,, Environment.getExternalStorageDirectory()
是获取您的app目录的方法。
最后是处理文件的类文件......
答案 9 :(得分:1)
我在4.4上运行的应用程序遇到了类似的问题。我做的是一种黑客攻击。
我重命名了这些文件并在我的应用程序中忽略了它们。
即。
File sdcard = Environment.getExternalStorageDirectory();
File from = new File(sdcard,"/ecatAgent/"+fileV);
File to = new File(sdcard,"/ecatAgent/"+"Delete");
from.renameTo(to);
答案 10 :(得分:0)
这对我有用。
String myFile = "/Name Folder/File.jpg";
String my_Path = Environment.getExternalStorageDirectory()+myFile;
File f = new File(my_Path);
Boolean deleted = f.delete();
答案 11 :(得分: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
}
答案 12 :(得分:0)
您可以删除文件,如下所示:
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());
}
}
答案 13 :(得分:-1)
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();