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

时间:2010-12-13 16:14:49

标签: 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();

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

9 个答案:

答案 0 :(得分:15)

Android有各种各样的缓存来跟踪媒体文件。

试试这个:

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

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

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

<intent-filter>
  <action android:name="android.intent.action.MEDIA_MOUNTED" />
  <data android:scheme="file" /> 
</intent-filter>

答案 1 :(得分:10)

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

在N5上测试。 Android 4.4。

编辑:其他人已经声明这不适用于4.2

new AsyncTask<Void, Void, Void>(){
        @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();

答案 2 :(得分:6)

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

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

当你调用insert时,只需确保'imageUri'是uri返回给你的。

答案 3 :(得分:3)

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

    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列更改为不存在的文件路径。

答案 4 :(得分:2)

取自: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);
}
});

答案 5 :(得分:1)

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

答案 6 :(得分:1)

File.delete();之后添加此行:

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

答案 7 :(得分:1)

<svg><path></path><text></text></svg>

答案 8 :(得分:0)

在删除文件后添加此权限:

MediaScannerConnection.scanFile(context, arrayOf(imageURI.getPath()), null, null)

:)