Медиа-миниатюры для Android. Серьезные проблемы? - PullRequest
2 голосов
/ 25 мая 2010

Я уже давно играю с миниатюрами андроида и вижу некоторые несоответствия, которые заставляют меня хотеть кричать. Моя цель - создать простой список всех изображений (и отдельный список для видео) с миниатюрой и именем файла.

Устройство: HTC Evo (свежий от Google I / O)

Сначала: http://androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.html

Этот код, похоже, не работает вообще, эскизы дублируются ... некоторые с эффектом "зеркала", а некоторые без. Также некоторые не загружаются и просто отображают черный квадрат. Я попытался восстановить миниатюры, удалив каталог "alblum thumbs" с SD-карты. Приложение HTC в галерее, кажется, показывает все отлично.

Этот подход, кажется, работает:

Bitmap thumb = MediaStore.Images.Thumbnails.getThumbnail(
    getContentResolver(),
    id, MediaStore.Video.Thumbnails.MICRO_KIND, null);
imageView.setImageBitmap(curThumb);

где id - это исходный идентификатор изображения, а imageView - это некоторое представление изображения. Это замечательно! Но, как ни странно, это слишком медленно для использования внутри SimpleViewBinder. Следующий подход:

String [] proj = {MediaStore.Images.Thumbnails._ID};
Cursor c = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
    proj, MediaStore.Images.Thumbnails.IMAGE_ID + "=" +id ,
    null, null);

if (c != null && c.moveToFirst()) {
    Uri thumb = Uri.withAppendedPath(mThumbUri,c.getLong(0)+"");
    imageView.setImageURI(thumb);
}

Я должен объяснить, что, по моему мнению, необходимо условие WHERE, потому что нет никаких гарантий, что у вашего URI будет одинаковый идентификатор для эскиза и его родительского изображения. Это работает для всех текущих изображений, но как только я начинаю добавлять изображения с камеры, они отображаются как пустые! Отладка показывает ужас:

SkImageDecoder::Factory returned null

ошибка и URI возвращается как недействительный. Это те же изображения, которые работают с предыдущим звонком. Кто-нибудь может поймать мой логический сбой или указать на какой-нибудь рабочий код?

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

Исходя из моего опыта, поставщик содержимого миниатюр вернет URI содержимого и путь к файлу изображения, даже если этот эскиз еще не создан. Вызов MediaStore.Images.Thumbnails.getThumbnail () фактически создаст миниатюру (и поместит ее туда, куда уже указывает URI контента), если таковой не существует. Это не было ясно для меня в документации, но похоже, что происходит.

1 голос
/ 09 мая 2011

Загрузить миниатюру видео, где mThumbButton - это кнопка ImageButton:

public void loadThumb(int videoId)
    {
        String [] proj = {MediaStore.Video.Thumbnails._ID};
        Cursor c = managedQuery(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,
            proj, MediaStore.Video.Thumbnails.VIDEO_ID + "=" +videoId ,
            null, null);

        if (c != null && c.moveToFirst()) {
            Uri thumb = Uri.withAppendedPath(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,c.getLong(0)+"");
            mThumbButton.setImageURI(thumb);
        }

    }
1 голос
/ 13 июля 2010

вы можете решить вашу проблему, обратившись к MediaStore.Images.Media._ID вместо поставщика содержимого миниатюр

...