Android文件删除在Gallery中留下空占位符

我通过以下方式插入图片:

ContentValues values = new ContentValues(); values.put(Images.Media.TITLE, filename); values.put(Images.Media.DATE_ADDED, System.currentTimeMillis()); values.put(Images.Media.MIME_TYPE, "image/jpeg"); Uri uri = this.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values); 

但是当我尝试删除时

  File f = new File(imageURI); f.delete(); 

图片不再存在,但空占位符是。 有任何想法吗?

Solutions Collecting From Web of "Android文件删除在Gallery中留下空占位符"

Android有各种缓存,可以跟踪媒体文件。

尝试这个:

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

它使MediaScanner服务再次运行,这应该从设备的缓存中删除已删除的图像。

您似乎还需要将此权限添加到AndroidManifest.xml:

     

如评论中所述,接受的答案使用了大量内存。 虽然MediaScannerConnection没有“deleteFile”方法,但只要在删除文件后将旧文件路径传递给“scanFile”方法即可。 媒体扫描程序将重新扫描并删除媒体。

在N5上测试。 Android 4.4。

编辑:其他人已表示这不适用于4.2

 new AsyncTask(){ @Override protected Void doInBackground(Void... params) { String filePath = recording.file.getAbsolutePath(); recording.file.delete(); MediaScannerConnection.scanFile(context, new String[]{filePath}, null, null); return null; } }.execute(); 

您还可以使用以下方法从图库中删除图像:

getContentResolver()。delete(imageUri,null,null);

只需确保在调用insert时’imageUri’是uri返回给你的。

如果您不知道@manisha和@Muhammad Waqas Khan的答案中所需的image-id,您也可以通过文件名删除

  String fullPathToFile = "/storage/sdcard0/DICM/test.jpg"; getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.DATA + "=?", new String[]{ fullPathToFile } ); 

[更新2016-06-16]

危险:这看起来像“只删除mediaDB中的项目”。 由于mediaDB中存在SQLite-cascade-file-delete-trigger,因此引用的文件也会被删除(如果存在)。

为避免这种情况,您必须在调用delete之前将MediaStore.Images.Media.DATA列更改为不存在的文件路径。

取自: http : //developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.html

这对我有用(在HTC Desire,Android 2.3上测试)

 // Tell the media scanner about the new file so that it is // immediately available to the user. MediaScannerConnection.scanFile(this,new String[] { file.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } }); 

使用此方法getContentResolver()。delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.Media._ID +“=?”,new String [] {Long.toString(id)});

File.delete();之后添加这一行File.delete();

 MediaScannerConnection.ScanFile(this,new string[]{fileUrl.ToString()}, null, null);