【问题标题】:MediaStore.Images.Media is not capable of showing all images, solutionMediaStore.Images.Media 无法显示所有图像,解决方案
【发布时间】:2014-09-22 14:31:23
【问题描述】:

使用 MediaStore.Images.Media 进行查询不会显示所有图像,无论是查询内部内容还是外部内容

即使在主流设备上,结果(缩略图和从中检索这些缩略图的位置)也不相同。没有 SD 卡且只有内部存储的设备有不同的图像结果,三星设备有不同的结果,谷歌设备有不同的结果。

特别是在stackoverflow周围使用的这段代码作为解决方案,

            final String[] columns = {MediaStore.Images.Thumbnails._ID};
            final String orderBy = MediaStore.Images.Media._ID;
            Cursor imagecursor = context.getContentResolver().query(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
                    null, null, orderBy);
            if (imagecursor != null) {
                int image_column_index = imagecursor
                        .getColumnIndex(MediaStore.Images.Media._ID);
                int count = imagecursor.getCount();
                for (int i = 0; i < count; i++) {
                    imagecursor.moveToPosition(i);
                    int id = imagecursor.getInt(image_column_index);
                    ImageItem imageItem = new ImageItem();
                    imageItem.id = id;
                    lastId = id;
                    imageItem.img = MediaStore.Images.Thumbnails.getThumbnail(
                            context.getApplicationContext().getContentResolver(), id,
                            MediaStore.Images.Thumbnails.MINI_KIND, null);
                    images.add(imageItem);
                }
                imagecursor.close();

我查看了代码,它看起来不错,但我需要一个更好的解决方案,因为结果各不相同,而且在某些设备上,我不知道生成的缩略图是从哪里提取的

【问题讨论】:

  • getThumbnail 图像在创建之前不存在。您将从问题中获得缩略图以回答查询所有图像。
  • @danny117 “你会从你的问题中得到缩略图来回答查询所有图像”什么?这对我来说似乎不是一个连贯的句子,你是说我只查询缩略图,但我应该查询不同的图像访问器?
  • 您有获取缩略图的示例代码。缩略图图像可以由操作系统动态创建。 getThumbnail 方法检查是否已创建指定图像 (origId) 的缩略图。它将被阻止,直到生成缩略图。因此缩略图可能尚未创建,因此它们不存在于设备上。你想要所有的图像还是所有的缩略图?
  • @danny117 我想要所有的图像。我没有意识到检索缩略图的这些问题,但最终我只想要图像而不真正关心缩略图。我认为缩略图会节省内存,但它可能根本不是一个好的解决方案。你能发布更好的代码来获取所有图像吗?
  • 上面的代码有一些问题。在获取缩略图之前使用数据列并对其执行 file.exists() 会更准确,因为某些图像文件可能已被代码删除。

标签: android android-contentprovider android-gallery mediastore


【解决方案1】:

正如@danny117 向我指出的那样,试图获得缩略图是一个有缺陷的假设。不能依赖 android 系统中每个图像的缩略图的存在。

所以我最终会根据 mime 类型检索所有图像,并使用 Files MediaStore

 String[] projection = {
            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
    };

    // Return only video and image metadata.
    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 cursorLoader = new CursorLoader(
            getActivity(),
            queryUri,
            projection,
            selection,
            null, // Selection args (none).
            MediaStore.Files.FileColumns.DATE_ADDED + " DESC" // Sort order.
    );


    images.clear();
    /*
        final String[] columns = {MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATE_ADDED};
        final String orderBy = MediaStore.Images.Media.DATE_ADDED + " DESC";
        Cursor imagecursor = getActivity().getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
            null, null, orderBy);
    */

    Cursor imagecursor = cursorLoader.loadInBackground();

    if (imagecursor != null) {
        int image_column_index = imagecursor
                .getColumnIndex(MediaStore.Files.FileColumns._ID);
        int type_column_index = imagecursor.getColumnIndex(MediaStore.Files.FileColumns.MIME_TYPE);
        int count = imagecursor.getCount();
        for (int i = 0; i < count; i++) {
            imagecursor.moveToPosition(i);
            int id = imagecursor.getInt(image_column_index);
            String mime_type = imagecursor.getString(type_column_index);
            ImageItem imageItem = new ImageItem();
            imageItem.id = id;
            //lastId = id;

            if(!mime_type.contains("video"))
                imageItem.uriString = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(id)).toString();
            else
                imageItem.uriString = MediaStore.Video.Media.EXTERNAL_CONTENT_URI.withAppendedPath(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, String.valueOf(id)).toString();



            images.add(imageItem);
        }

        //add ImageItem at top of list

        imagecursor.close();
    }

【讨论】:

  • 我只想从图库中获取最近点击的 20 张图片,您是否有解决方案,当我使用 Cursor imagecursor = getContentResolver() 时,我的应用程序也很慢.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,列,空,空,orderBy);访问时间可以改进吗,如果你有修复请回复,stackoverflow.com/questions/36417861/…
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2020-11-21
  • 2018-12-15
  • 1970-01-01
相关资源
最近更新 更多