Мне не удалось получить эскиз для работающей папки. Вместо этого я справился почти с тем же успехом, запустив галерею для первого изображения в папке.
Вот описание того, чего я хотел достичь. Пользователь выбирает конкретную запись из списка. С этой записью может быть связано несколько изображений. Я хотел иметь возможность просматривать эти изображения с помощью классного приложения Gallery3D на Nexus One (теперь с мультисенсорным зумом!). Если изображения для этой записи еще не кэшированы на SD-карте устройства, я скачаю их в виде zip-файла. Затем я извлекаю этот файл в каталог кеша для этой записи на SDCard. После этого я хотел запустить галерею и отображать только изображения в этой директории кэша.
Выполнение загрузки и распаковки zip-файла на SDCard не было проблемой. Но чтобы заставить галерею работать, мне пришлось использовать MediaScannerConnection с MediaScannerConnectionClient. После подключения сканера (что было довольно странно) я перебрал все файлы в директории кеша, вызвав scanner.scanFile.
MediaScannerConnectionClient # onScanCompleted будет добавлять полученные URI к переменной-члену ArrayList. Когда весь процесс был закончен, я запускаю галерею, пропуская первый URI в этом списке. Это будет просматривать первое изображение в каталоге. Я бы предпочел просмотр миниатюр, но этого достаточно.
Мне не совсем комфортно с этим решением. Кажется, что MediaScannerConnection работает асинхронно, поэтому моя AsyncTask выполняет опрос / сон, чтобы проверить, завершено ли сканирование.
У кого-нибудь еще были проблемы с подключением MediaScannerConnection при первом вызове? Чтобы обойти это, я делаю что-то вроде:
MediaScannerConnection scanner = ...;
for (int attempts = 0; attempts < MAX_ATTEMPTS; attempts++) {
scanner.connect();
if (scanner.isConnected()) { break; }
else {
try { Thread.sleep(5); }
catch (Exception e){}
}
}
if (!scanner.isConnected()) {
throw new IllegalStateException("Unable to establish media scanner connection!");
}
Ужасно, я знаю, но я не уверен, почему возникают проблемы с подключением в первый раз. : - /
UPDATE:
Благодаря jeffamaphone я смог сбросить этот уродливый код. Теперь OnItemClickListener просто вызывает scanner.connect (). Клиент, который передается в конструктор сканера, инициализирует DownloadAsyncTask, который обновляет ProgressDialog, когда он распаковывает файлы и вызывает scanner.scanFiles (...);