android - 在加载图库之前刷新设备上的所有缩略图?

时间:2014-05-31 15:11:48

标签: android thumbnails mediastore

我有一个应用程序,它使用游标从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。在此先感谢:)

2 个答案:

答案 0 :(得分:2)

您应该可以使用以下方法触发重新扫描:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                        Uri.parse("file://"
                        + Environment.getExternalStorageDirectory())));

您可能需要改变路径以满足您的需求。

Found here


如果您想在继续前进之前等待扫描完成,则需要为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 +。