Am working in a photo gallery app, due to the recent nougat update i couldn't delete file from gallery.
I found out that I have to use Fileprovider
for file access, I tried below code but it says
04-25 12:52:03.031 3204-4133/com.zo.tns1 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
Process: com.zo.tns1, PID: 3204
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:325)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.io.File android.support.v4.content.FileProvider$PathStrategy.getFileForUri(android.net.Uri)' on a null object reference
at android.support.v4.content.FileProvider.delete(FileProvider.java:520)
at com.zo.tns1.tasks.DeleteMediaTask.doInBackground(DeleteMediaTask.java:117)
at com.zo.tns1.tasks.DeleteMediaTask.doInBackground(DeleteMediaTask.java:39)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Manifest
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.zo.tns1.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/fileaccess_paths"/>
</provider>
fileaccess_paths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="all_files" path="." />
Java Code
File f = new File(mediaList.get(i).getMediaPath());
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
FileProvider provider = new FileProvider();
Uri deleteFileUri = FileProvider.getUriForFile(context.getApplicationContext(), "com.zo.tns1.fileprovider", f);
context.grantUriPermission(context.getApplicationContext().getPackageName(), deleteFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
provider.delete(deleteFileUri, null, null);
//context.getContentResolver().delete(deleteFileUri, null, null);
} else {
boolean b = f.delete();
Log.d(TAG, "File delete -> " + b);
}
FilePath
/storage/emulated/0/DCIM/Camera/IMG_20170421_112804_1.jpg
You can't just use the FileProvider
constructor like that, you need to go via your context's content resolver. That will give you the provider you've specified in the manifest. Something like
context.getContentResolver().delete(deleteFileUri, null, null);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With