繁体   English   中英

MediaStore.Images.Media无法显示所有图像,解决方案

[英]MediaStore.Images.Media is not capable of showing all images, solution

使用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();

我看了一下代码,听起来似乎很不错,但是我需要一个更好的解决方案,因为结果会有所不同,而且在某些设备上,我不知道从哪个缩略图中提取了结果。

正如@ danny117向我指出的那样,尝试获取THUMBNAILS是一个错误的假设。 不能依靠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();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM