16

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

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

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

我也在 Manifest 文件中获得了许可。

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

4 回答 4

12

使用ContentResolver删除媒体文件是错误的,给用户带来了很多问题。
您不能简单地通过从高于sd-card的 Android 版本中删除其信息来删除文件。 它仅适用于. 这就是 Android 团队提供DocumentProvider的原因。 ContentResolverJelly Bean(4.3)
KitKat(4.4)

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

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

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

于 2017-07-31T00:54:23.813 回答
10
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();
}
于 2017-07-24T11:43:33.333 回答
5

从 Android 4.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");
}

wherefilename是要删除的文件的名称,uri是返回的 URI ACTION_OPEN_DOCUMENT_TREE

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 */
            }
        }
    }
}
于 2018-07-04T11:56:51.230 回答
3

使用Environment.getExternalStorageDirectory().getAbsolutePath()而不是硬编码存储路径

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
File f = new File(baseDir + "/714D-160A/Xender/image/Screenshot_commando.png");
boolean d = f.delete();
于 2017-07-23T07:55:00.013 回答