我无法获得工作文件夹的缩略图视图。相反,我通过在文件夹中的第一张图像上启动画廊来管理几乎一样好的东西。
这是我想要完成的描述。用户从列表视图中选择特定记录。该记录可以有一些与之关联的图像。我希望能够使用 Nexus One 上酷炫的 Gallery3D 应用程序浏览这些图像(现在具有多点触控缩放功能!)。如果该记录的图像尚未缓存在设备的 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!");
}
丑我知道,但我不确定为什么第一次连接有问题。:-/
更新:感谢 jeffamaphone,我能够转储那些丑陋的代码。现在 OnItemClickListener 只需调用scanner.connect()。传递给扫描仪构造函数的客户端初始化 DownloadAsyncTask,它在解压缩文件并调用scanner.scanFiles(...) 时更新ProgressDialog;