使用MediaScanner刷新缩略图

时间:2011-10-18 10:06:54

标签: android android-mediascanner

当我将图像保存到新位置然后使用MediaScanner刷新图库时,一切都很好 - 缩略图和图像都会刷新。

但是当我将图像保存到EXISTING位置然后使用MediaScanner时 - 只有'新'缩略图不会刷新。 (即使文件被覆盖)。

如何解决?

这是我的代码:

File file = new File(SDCARD_PATH, filename);

try {
    FileOutputStream out = new FileOutputStream(file);
    bmp.compress(format, BEST_IMAGE_QUALITY, out);
}catch (FileNotFoundException e) {

}

//refreshing single file using media scanner, no need to paste

2 个答案:

答案 0 :(得分:1)

这是Android中常见且众所周知的问题。如果编辑媒体文件,则缩略图似乎不会更新。

我对此有一个解决方案,但是,它仍然是一个修复而不是一个干净的解决方案。 我的修复很简单,它基本上删除了陈旧的缩略图,然后使用媒体扫描程序更新缩略图。

以下是要遵循的步骤:

步骤1.根据需要编辑文件。说文件名,“myVideoToBeEdited”。

步骤2.完成编辑后,删除其现有缩略图。 首先,使用以下代码获取视频ID:

                final String[] columns = {
                    BaseColumns._ID, MediaColumns.DATA
                };

            ContentResolver cr = context.getContentResolver();
            Cursor cursor = cr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, columns, null, null, null);

            boolean cancel = false;
            if(null != cursor){
                while(cursor.moveToNext() && !cancel){
                    String fileName = cursor.getString(cursor.getColumnIndex(MediaColumns.DATA));
                    int imageId = cursor.getInt(cursor.getColumnIndex(BaseColumns._ID));

                    if(fileName.equals(myVideoToBeEdited)){
                        removeVideoThumbnail(getContentResolver(), imageId); // step 3
                        cancel = true;
                    }
                }
            }

还有其他方法可以获取ID,也可以使用更优化的ID。

步骤3.删除缩略图。

        public void removeVideoThumbnail(ContentResolver contentResolver, long photoId) {
        Cursor thumbnails = contentResolver.query(android.provider.MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, null, android.provider.MediaStore.Video.Thumbnails.VIDEO_ID + "=?", new String[]{String.valueOf(photoId)}, null);
        for (thumbnails.moveToFirst(); !thumbnails.isAfterLast(); thumbnails.moveToNext()) {

            long thumbnailId = thumbnails.getLong(thumbnails.getColumnIndex(android.provider.MediaStore.Video.Thumbnails._ID));
            String path = thumbnails.getString(thumbnails.getColumnIndex(android.provider.MediaStore.Video.Thumbnails.DATA));
            File file = new File(path);
            if (file.delete()) {

                contentResolver.delete(android.provider.MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, android.provider.MediaStore.Video.Thumbnails._ID + "=?", new String[]{String.valueOf(thumbnailId)});

            }

        }
    }

或者,这是删除图像缩略图的方法

    public void removeImageThumbnail(ContentResolver contentResolver, long photoId) {
        Cursor thumbnails = contentResolver.query(android.provider.MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, null, android.provider.MediaStore.Images.Thumbnails.IMAGE_ID + "=?", new String[]{String.valueOf(photoId)}, null);
        for (thumbnails.moveToFirst(); !thumbnails.isAfterLast(); thumbnails.moveToNext()) {

            long thumbnailId = thumbnails.getLong(thumbnails.getColumnIndex(android.provider.MediaStore.Images.Thumbnails._ID));
            String path = thumbnails.getString(thumbnails.getColumnIndex(android.provider.MediaStore.Images.Thumbnails.DATA));
            File file = new File(path);
            if (file.delete()) {

                contentResolver.delete(android.provider.MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, android.provider.MediaStore.Images.Thumbnails._ID + "=?", new String[]{String.valueOf(thumbnailId)});

            }

        }
    }

步骤4.最后使用媒体扫描程序连接扫描文件,以便更新缩略图。

         MediaScannerConnection.scanFile(context,
              new String[] { myVideoToBeEdited }, null,
              new MediaScannerConnection.OnScanCompletedListener() {
          public void onScanCompleted(String path, Uri uri) {
                      // pass the mime type, else passing a null will enable file extension to dictate the mime type
              // you are good to go
          }
     });

答案 1 :(得分:0)

在将新图片保存到文件系统之前,您是否尝试删除“旧”图片?像这样:

File file = new File(SDCARD_PATH, filename);

try {
    // Delete the "old" file.
    if (file.exists()) {
        file.delete();
    }

    FileOutputStream out = new FileOutputStream(file);
    bmp.compress(format, BEST_IMAGE_QUALITY, out);
}catch (FileNotFoundException e) {
}catch (SecurityException e) {
}