Обновление эскиза с помощью MediaScanner - PullRequest
0 голосов
/ 18 октября 2011

Когда я сохраняю изображение в новом месте, а затем использую 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

Ответы [ 2 ]

1 голос
/ 14 января 2014

Это распространенная и хорошо известная проблема в Android.Если вы редактируете мультимедийный файл, миниатюра, похоже, не обновляется.

У меня есть исправление для этого, однако, это все еще исправление, а не чистое решение.Мое исправление простое, и оно в основном удаляет устаревшие миниатюры, а затем использует медиа-сканер для обновления миниатюр.

Вот шаги, которые необходимо выполнить:

Шаг 1. Отредактируйте файл кактебе нравится.Скажите имя файла, «myVideoToBeEdited».

Шаг 2. Как только вы закончите редактирование, удалите существующий эскиз.Во-первых, получите идентификатор видео, используя такой код:

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

Существуют и другие способы получения идентификатора, а также более оптимизированные.

Шаг 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
          }
     });
0 голосов
/ 18 октября 2011

Вы пытались удалить «старую» картинку перед сохранением новой в файловую систему?Вот так:

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