10

删除 Android SD 卡上的图像时,有时图像会被正确删除,但在图库中仍保留已删除图像的预览。点击它时,它被加载为黑色图像。要解决它,我需要运行MediaScanner. 但是此代码不起作用,并且评论图像的预览仍保留在图库中。

任何人都知道如何解决这个问题。

Uri contentUri = Uri.fromFile(file);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,contentUri); 
sendBroadcast(mediaScanIntent);
4

5 回答 5

17

您应该从 mediaStore 中删除它

public static void deleteFileFromMediaStore(final ContentResolver contentResolver, final File file) {
    String canonicalPath;
    try {
        canonicalPath = file.getCanonicalPath();
    } catch (IOException e) {
        canonicalPath = file.getAbsolutePath();
    }
    final Uri uri = MediaStore.Files.getContentUri("external");
    final int result = contentResolver.delete(uri,
            MediaStore.Files.FileColumns.DATA + "=?", new String[] {canonicalPath});
    if (result == 0) {
        final String absolutePath = file.getAbsolutePath();
        if (!absolutePath.equals(canonicalPath)) {
            contentResolver.delete(uri,
                    MediaStore.Files.FileColumns.DATA + "=?", new String[]{absolutePath});
        }
    }
}
于 2014-03-24T10:24:12.933 回答
11

虽然

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

仅限于 4.4 的系统应用程序

这是另一种解决方案..传递您已删除或添加的图像的路径,如果图像被删除,则图像传递true,或者如果将图像添加到图库,则传递false

    /**
 * Scanning the file in the Gallery database
 * 
 * @param path
 * @param isDelete
 */
private void scanFile(String path, final boolean isDelete) {
    try {
        MediaScannerConnection.scanFile(context, new String[] { path },
                null, new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        if (isDelete) {
                            if (uri != null) {
                                context.getContentResolver().delete(uri,
                                        null, null);
                            }
                        }
                    }
                });
    } catch (Exception e) {
        e.printStackTrace();
    }

}
于 2014-03-24T10:09:36.587 回答
2

对于删除时的每个文件,请使用此

奇巧

这对我有用

try {
            context.getContentResolver().delete(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    MediaStore.Images.Media.DATA + "='"
                            + new File(fileUri).getPath() + "'", null);
        } catch (Exception e) {
            e.printStackTrace();

        }
于 2015-07-16T12:05:35.927 回答
0

尝试这个:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

将此添加到您的清单中:

<intent-filter>
            <action android:name="android.intent.action.MEDIA_MOUNTED" />
            <data android:scheme="file" /> 
        </intent-filter>
于 2014-03-24T10:02:50.317 回答
0

我一直在寻找 C# Xamarin Code 并为 Xamarin-Android 找到了这个

您可以将多个已删除的文件地址/路径传递给ScanFile(Context,string[])以便 Mediascanner 获得通知并更新图库

 Android.Media.MediaScannerConnection.ScanFile(Android.App.Application.Context, new string[] { deletedImageFilePath}, null, null); 
于 2021-01-01T19:52:22.067 回答