MediaStore.Images.Media не может отображать все изображения, решение

выполнение запроса с помощью MediaStore.Images.Media не показывает все изображения, независимо от того, запрашивает ли он внутренний контент или внешний контент

Результаты (миниатюры и место, откуда эти миниатюры извлекаются) различаются даже на основных устройствах. Устройства без SD-карты и только с внутренней памятью имеют разные результаты изображения, устройства Samsung имеют разные результаты, устройства Google имеют разные результаты.

В частности, с этим кодом, который используется вокруг 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();

Я смотрю на код, и он кажется здравым, но мне нужно лучшее решение, потому что результаты различаются, и на некоторых устройствах я понятия не имею, откуда были взяты получившиеся эскизы.


person CQM    schedule 22.09.2014    source источник
comment
Изображения getThumbnail не существуют, пока они не созданы. Вы получите миниатюры из своего вопроса, чтобы ответить на запрос всех изображений.   -  person danny117    schedule 29.09.2014
comment
@ danny117 Вы получите миниатюры из своего вопроса, чтобы ответить на вопрос, все изображения что? это не кажется мне связным предложением, вы говорите, что я запрашиваю только миниатюры, но вместо этого я должен запрашивать другой метод доступа к изображениям?   -  person CQM    schedule 29.09.2014
comment
у вас есть пример кода для получения миниатюры изображения. Миниатюры изображений могут быть созданы ОС на лету. Метод getThumbnail проверяет, были ли созданы миниатюры указанного изображения (origId). Он будет заблокирован до тех пор, пока не будут сгенерированы эскизы. Поэтому эскизы могут быть не созданы и поэтому их нет ни на устройстве, ни там. Что вы хотите, все изображения или все эскизы?   -  person danny117    schedule 29.09.2014
comment
@ danny117 Я хочу все изображения. Я не осознавал этих проблем с получением миниатюр, но в конечном итоге мне нужны только изображения, а миниатюры меня не волнуют. Я думал, что миниатюры сэкономят память, но это может быть не очень хорошим решением. Можете ли вы опубликовать лучший код для получения только всех изображений?   -  person CQM    schedule 29.09.2014
comment
приведенный выше код имеет некоторые проблемы. Было бы более точно использовать столбец данных и выполнить для него file.exists() перед получением миниатюры, потому что какой-то файл изображения мог быть удален с помощью кода.   -  person danny117    schedule 30.09.2014


Ответы (1)


Как указал мне @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();
    }
person CQM    schedule 01.10.2014
comment
Я хочу получить только 20 изображений из галереи, которые должны быть последним кликом, у вас есть решение для этого, и мое приложение работает очень медленно, когда я использую Cursor imagecursor = getContentResolver().query( MediaStore.Images.Media .EXTERNAL_CONTENT_URI, столбцы, null, null, orderBy); можно ли улучшить время доступа, если у вас есть исправление, ответьте, stackoverflow.com/questions/36417861/ - person HAXM; 05.04.2016