无法以编程方式从Android中的外部存储中删除文件

我正在尝试删除位于路径中的文件

/storage/714D-160A/Xender/image/Screenshot_commando.png

到目前为止,我所做的工作:

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

并且文件仍在其位置(未删除:()

此外,我还在清单文件中授予了权限。

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

答案 1
public static boolean delete(final Context context, final File file) {
    final String where = MediaStore.MediaColumns.DATA + "=?";
    final String[] selectionArgs = new String[] {
            file.getAbsolutePath()
    };
    final ContentResolver contentResolver = context.getContentResolver();
    final Uri filesUri = MediaStore.Files.getContentUri("external");

    contentResolver.delete(filesUri, where, selectionArgs);

    if (file.exists()) {

        contentResolver.delete(filesUri, where, selectionArgs);
    }
    return !file.exists();
}

答案 2

用于删除媒体文件是错误的,并且会给用户带来许多问题。
您不能简单地通过从大于 的 Android 版本中删除其信息来删除文件。
它仅适用于 之前的 Android 版本。
这就是Android团队提供DocumentProvider的原因。ContentResolversd-cardContentResolverJelly Bean(4.3)KitKat(4.4)

为什么 contentResolver.delete(...) 是错误的?
1.填满SD卡
当您尝试删除Android版本大于4.3的媒体文件时,实际的媒体文件将保持不变,因为该方法仅删除媒体的信息(名称,日期,路径...),并且您最终会拥有未注册的媒体文件,这些文件不再知道它们的存在,这就是为什么您无法在图库中看到它们并且您认为当它们仍然存在时,它们已使用此方法删除,并在用户每次尝试删除上的媒体文件时填充。sd-cardContentResolvercontentResolver.delete(...)sd-cardContentResolversd-cardsd-card

媒体文件(图像,视频,GIF等)将返回图库
有许多应用程序,特别是图库和文件管理器,它们会找到这些未注册的媒体文件,并将它们添加到正常行为中,而用户则认为他/她不需要的媒体文件已经消失。当然,没有用户希望他/她假设删除的图像或视频出现在演示过程中。ContentResolver

那么,删除SD卡上的媒体文件的正确方法是什么?
好吧,这里已经使用.DocumentProvider