【问题标题】:Refreshing the thumbnail using MediaScanner使用 MediaScanner 刷新缩略图
【发布时间】:2011-10-18 10:06:53
【问题描述】:

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

但是当我将图像保存到现有位置然后使用 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

【问题讨论】:

  • “但是当我将图像保存到现有位置然后使用 MediaScanner 时”——您能否在此处发布您的代码以便我们为您提供帮助?

标签: android android-mediascanner


【解决方案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 的方法,以及更优化的方法。

第 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
          }
     });

【讨论】:

  • 什么是 myVideoToBeEdited?旧文件名还是新文件名?
  • 我们在这里讨论的是编辑现有文件。所以它的名字是一样的。
  • 如果我在图库中重命名文件,它就不起作用。文件来自 = new File(directory, oldFileName);文件到 = 新文件(目录,新文件名); from.renameTo(to);
  • 如果您正在重命名,那么您完全是在谈论一个不同的问题,而不是这里讨论的问题。但是,只要按照第 4 步操作,您的问题就可以得到解决。
  • @codeFood 可以帮助我使用它的路径从图库中删除图像,它已成功删除,但删除后我想获得正确的缩略图,但从图库中删除图像后,我的缩略图没有更新来自特定专辑文件夹,但缩略图仍然存在
【解决方案2】:

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

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) {
}

【讨论】:

  • 好吧..它不起作用。我仍在寻找解决此问题的方法
猜你喜欢
  • 2014-02-13
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2019-01-07
  • 2020-09-17
相关资源
最近更新 更多