如何通知MediaStore某些项目被删除?

时间:2018-02-11 15:30:23

标签: java android mediastore

我有一个简单的图库应用,用户可以在其中拍摄或删除照片。为了拍照,这适用于通知MediaStore新创建的文件:

File file = new File(storageDir, createImageName());

final Uri uri = Uri.fromFile(file);

Intent scanFileIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(scanFileIntent);

我删除了照片,但本地图库应用仍会将其显示为空白文件。 这不起作用。我的目标是最低Android 5.0:

File file = new File(Environment.getExternalStorageDirectory() + File.separator + "Folder where application stores photos");

final Uri uri = Uri.fromFile(file);


Intent scanFileIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(scanFileIntent);

我要做的是扫描我的应用程序在删除文件时创建的文件夹,以通知MediaStore删除的图像和文件夹。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

这是一种从 MediaStore 中删除媒体文件的任何记录的方法。

请注意,MediaStore 中的 DATA 列是指文件的完整路径。

    public static boolean deleteFileFromMediaStore(
            Context context, String fileFullPath)
    {
        File file = new File(fileFullPath);

        String absolutePath, canonicalPath;
        try { absolutePath = file.getAbsolutePath(); }
        catch (Exception ex) { absolutePath = null; }
        try { canonicalPath = file.getCanonicalPath(); }
        catch (Exception ex) { canonicalPath = null; }

        ArrayList<String> paths = new ArrayList<>();

        if (absolutePath != null) paths.add(absolutePath);
        if (canonicalPath != null && !canonicalPath.equalsIgnoreCase(absolutePath))
            paths.add(canonicalPath);

        if (paths.size() == 0) return false;

        ContentResolver resolver = context.getContentResolver();
        Uri uri = MediaStore.Files.getContentUri("external");

        boolean deleted = false;

        for (String path : paths)
        {
            int result = resolver.delete(uri,
                    MediaStore.Files.FileColumns.DATA + "=?",
                    new String[] { path });

            if (result != 0) deleted = true;
        }

        return deleted;
    }