如何在Android上以编程方式删除文件?

我在4.4.2上,试图通过uri删除一个文件(图片)。 这是我的代码:

File file = new File(uri.getPath()); boolean deleted = file.delete(); if(!deleted){ boolean deleted2 = file.getCanonicalFile().delete(); if(!deleted2){ boolean deleted3 = getApplicationContext().deleteFile(file.getName()); } } 

现在,这些删除function都没有实际删除文件。 我也在我的AndroidManifest.xml中有这个:

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

Solutions Collecting From Web of "如何在Android上以编程方式删除文件?"

你为什么不用这个代码来testing它:

 File fdelete = new File(uri.getPath()); if (fdelete.exists()) { if (fdelete.delete()) { System.out.println("file Deleted :" + uri.getPath()); } else { System.out.println("file not Deleted :" + uri.getPath()); } } 

我认为问题的一部分是你永远不会试图删除文件,你只是不断创build一个方法调用的variables。

所以在你的情况下,你可以尝试:

 File file = new File(uri.getPath()); file.delete(); if(file.exists()){ file.getCanonicalFile().delete(); if(file.exists()){ getApplicationContext().deleteFile(file.getName()); } } 

不过我认为这有点矫枉过正。

你添加了一个你正在使用外部目录而不是uri的评论。 所以相反,你应该添加如下内容:

 String root = Environment.getExternalStorageDirectory().toString(); File file = new File(root + "/images/media/2918"); 

然后尝试删除该文件。

试试这个。 它正在为我工​​作。

 handler.postDelayed(new Runnable() { @Override public void run() { // Set up the projection (we only need the ID) String[] projection = { MediaStore.Images.Media._ID }; // Match on the file path String selection = MediaStore.Images.Media.DATA + " = ?"; String[] selectionArgs = new String[] { imageFile.getAbsolutePath() }; // Query for the ID of the media matching the file path Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; ContentResolver contentResolver = getActivity().getContentResolver(); Cursor c = contentResolver.query(queryUri, projection, selection, selectionArgs, null); if (c.moveToFirst()) { // We found the ID. Deleting the item via the content provider will also remove the file long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Images.Media._ID)); Uri deleteUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); contentResolver.delete(deleteUri, null, null); } else { // File not found in media store DB } c.close(); } }, 5000); 

我在牛轧糖模拟器上testing了这个代码,结果如下:

在清单中添加:

 <application... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> 

在res文件夹中创build空的xml文件夹,并在provider_paths.xml中创build以前的文件夹:

 <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths> 

然后把下一个片段放到代码中(例如片段):

 File photoLcl = new File(homeDirectory + "/" + fileNameLcl); Uri imageUriLcl = FileProvider.getUriForFile(getActivity(), getActivity().getApplicationContext().getPackageName() + ".provider", photoLcl); ContentResolver contentResolver = getActivity().getContentResolver(); contentResolver.delete(imageUriLcl, null, null); 

我看到你已经find了你的答案,但是这对我没有任何作用。 删除不断返回false,所以我尝试了以下,它的工作(对于谁select的答案没有工作的人):

 System.out.println(new File(path).getAbsoluteFile().delete()); 

系统输出明显可以忽略,为方便确认删除而添加。