I am trying to delete a file located at the path
/storage/714D-160A/Xender/image/Screenshot_commando.png
What I've done so far:
try{
String d_path = "/storage/714D-160A/Xender/image/Screenshot_commando.png";
File file = new File(d_path);
file.delete();
}catch(Exception e){
e.printStackTrace();
}
and the file is still at its place(Not deleted :( )
Also I've given permission in Manifest file.
<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" />
<uses-permission android:name="android.permission.STORAGE" />
From Android 4.4 onwards, you can't write to SD card files (except in the App directory) using the normal way. You'll have to use the Storage Access Framework using
DocumentFile
for that.The following code works for me:
where
filename
is the name of the file to be deleted anduri
is the URI returned byACTION_OPEN_DOCUMENT_TREE
:Using
ContentResolver
to delete media files is wrong and provides many problems for the user.You can not delete a file on the
sd-card
simply by deleting its information from theContentResolver
on Android versions greater thanJelly Bean(4.3)
.It works only on Android versions prior to
KitKat(4.4)
.That's why the Android team provided DocumentProvider.
Why
contentResolver.delete(...)
is wrong?1. Fills up the
sd-card
When you try to delete a media file on the
sd-card
by theContentResolver
on Android versions greater than 4.3, the actual media file will remain untouched because thecontentResolver.delete(...)
approach only removes the information (name, date, path ...) of the media and you will end up having unregistered media files on yoursd-card
whichContentResolver
has no idea about their existence anymore and that's why you couldn't see them in your gallery and you think they've been deleted with this approach while they're still there and fill up thesd-card
each time the user tries to delete a media file on thesd-card
.2. Media files (Images, videos, gifs ...) will come back to the gallery
There are many apps out there especially gallery and file manager ones that will find these unregistered media files and will add them to the
ContentResolver
again as of their normal behavior while the user assumes his/her unwanted media files are gone. Sure no user wants his/her assuming deleted images or videos show up in the middle of a demonstration.So, what's the correct approach to remove media files on the
sd-card
?Well, this has already been answered here with the use of
DocumentProvider
.Use
Environment.getExternalStorageDirectory().getAbsolutePath()
instead of hard coding storage path