Android FileProvider删除文件

标签 android

我在照片库应用程序中工作,由于最近的牛轧糖更新,我无法从图库中删除文件。 我发现我必须使用 Fileprovider 进行文件访问,我尝试了下面的代码,但它说

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) 

list

<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>

文件访问路径.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="all_files" path="." />

Java 代码

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);
            }

文件路径

/storage/emulated/0/DCIM/Camera/IMG_20170421_112804_1.jpg

最佳答案

您不能像那样只使用 FileProvider 构造函数,您需要通过上下文的内容解析器。这将为您提供您在 list 中指定的提供者。有点像

context.getContentResolver().delete(deleteFileUri, null, null);

关于Android FileProvider删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43536531/

相关文章:

java - 在 android webview 中禁用弹出窗口和警报框

android - getBuyIntentExtraParams 不存在?也就是如何使用第 6 版应用内结算 API?

Android - 如何在以编程方式按下按钮时更改按钮的背景图像?

android - 相对布局位置

java - 从通知导航到 Activity 时丢失 Activity 状态

Android 设备 adb 在 linux/Mac 上始终未经授权

android - 将 Activity 上下文传递到静态方法中,内存泄漏的可能性?

android - 准备 React Native 发布

android - 防止 RecyclerView 在滚动时更新项目

android - 如何使整个小部件区域可点击?