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

can't delete file from external storage in android programmatically

我正在尝试删除位于路径

的文件
/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" />

使用Environment.getExternalStorageDirectory().getAbsolutePath()代替硬编码存储路径

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
File f = new File(baseDir + "/714D-160A/Xender/image/Screenshot_commando.png");
boolean d = f.delete();
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();
}

使用ContentResolver删除媒体文件是错误的,会给用户带来很多问题。
您无法删除 sd-card 上的文件,只需从高于 Jelly Bean(4.3).
的 Android 版本的 ContentResolver 中删除其信息即可 它仅适用于 KitKat(4.4).
之前的 Android 版本 这就是 Android 团队提供 DocumentProvider 的原因。

为什么contentResolver.delete(...)是错误的?
1。填写 sd-card
当您尝试通过 ContentResolver 在 Android 大于 4.3 的版本上删除 sd-card 上的媒体文件时,实际的媒体文件将保持不变,因为 contentResolver.delete(...) 方法只会删除媒体的信息(名称、日期、路径...),您最终将在 sd-card 上拥有未注册的媒体文件,ContentResolver 不再知道它们的存在,这就是为什么您不能'在您的画廊中看不到它们,并且您认为它们已经被这种方法删除,而它们仍然存在并且每次用户尝试删除 sd-card 上的媒体文件时都会填满 sd-card

2。媒体文件(图片、视频、gif ...)将返回到图库
有许多应用程序,尤其是图库和文件管理器,它们会找到这些未注册的媒体文件,并会像正常行为一样将它们再次添加到 ContentResolver,而用户认为 his/her 不需要的媒体文件已经消失. 当然,没有用户希望 his/her 假设已删除的图像或视频出现在演示过程中。

那么,删除 sd-card 上的媒体文件的正确方法是什么?
好吧,这已经通过使用 DocumentProvider.

得到了回答 here

从Android4.4开始,您无法使用正常方式写入SD卡文件(App目录除外)。为此,您必须使用 DocumentFile 的存储访问框架。

以下代码适用于我:

private void deletefile(Uri uri, String filename) {
    DocumentFile pickedDir = DocumentFile.fromTreeUri(this, uri);

    DocumentFile file = pickedDir.findFile(filename);
    if(file.delete())
        Log.d("Log ID", "Delete successful");
    else
        Log.d("Log ID", "Delete unsuccessful");
}

其中filename是要删除的文件名,uriACTION_OPEN_DOCUMENT_TREE返回的URI:

private static final int LOCATION_REQUEST = 1;

private void choosePath() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    startActivityForResult(intent, LOCATION_REQUEST);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (requestCode == LOCATION_REQUEST && resultCode == Activity.RESULT_OK) {
        if (resultData != null) {
            Uri uri = resultData.getData();
            if (uri != null) {
                /* Got the path uri */
            }
        }
    }
}