我有一个应用程序,它使用游标从mediastore加载缩略图(到gridview中):
CursorLoader cursorLoader = null;
if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) >= android.os.Build.VERSION_CODES.HONEYCOMB) {
String[] from = { MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.DATA,
MediaStore.Files.FileColumns.DATE_ADDED,
MediaStore.Files.FileColumns.MEDIA_TYPE,
MediaStore.Files.FileColumns.MIME_TYPE,
MediaStore.Files.FileColumns.TITLE };
projection = from;
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE + " OR "
+ MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO;
Uri queryUri = MediaStore.Files.getContentUri("external");
cursorLoader = new CursorLoader(this, queryUri, projection,
selection, null, MediaStore.Files.FileColumns.DATE_ADDED
+ " DESC");
} else {
String[] from = { MediaStore.MediaColumns.DATE_ADDED };
projection = from;
Uri sourceImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
cursorLoader = new CursorLoader(this, sourceImageUri, null, null,
null, MediaStore.MediaColumns.DATE_ADDED + " DESC");
}
Cursor cursor = null;
if (cursorLoader != null) {
cursor = cursorLoader.loadInBackground();
mGalleryAdapter = new GalleryAdapter(this,
android.R.layout.simple_list_item_1, cursor, projection,
to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
gallery.setAdapter(mGalleryAdapter);
gallery.setOnItemClickListener(myOnItemClickListener);
}
然而,一些较新的图像在没有缩略图的情况下加载,这是相当愚蠢的。只有当我在手机上打开图库应用程序(照片)时才会生成缩略图。
如何在设备上以编程方式刷新所有缩略图,以便在没有缩略图的情况下没有图像留空?
我希望这适用于所有Android版本,包括4.4。在此先感谢:)
答案 0 :(得分:2)
您应该可以使用以下方法触发重新扫描:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
您可能需要改变路径以满足您的需求。
如果您想在继续前进之前等待扫描完成,则需要为ACTION_MEDIA_SCANNER_FINISHED
意图注册接收器。
Details and discussion on that here / RdvA7y4MqfE
kaiwid23表明这对4.4+并不起作用。在这种情况下,您可以使用MediaScannerConnection
手动控制扫描仪。
您需要使用MediaConnection.scanFile()
方法。如果提供了一个目录,或者它只接受单个路径,我不知道它是否以递归方式工作。
在这种情况下,您在构造函数中传递OnScanCompletedListener
,因此监视扫描完成实际上要容易得多。
答案 1 :(得分:0)
使用MediaStore.Images.Thumbnails.getThumbnail()
或MediaStore.Video.Thumbnails.getThumbnail()
- 它是一个阻止类,如果找不到,则会生成新的位图。更简单。
您只需要文件的MediaStore ID,我假设您拥有该ID,您可以在Activity中或通过上下文使用标准的getContentResolver()。此方法还允许您直接以MINI或MICRO尺寸获取位图。
有关此here的详情。
正如不可分割所说,你可以使用
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
但是,这不适用于Android 4.4(我认为),因此请考虑将MediaScanner类用于API 19 +。