Intereting Posts
Импортируйте Android-зал в Android Studio Android Fatal signal 11 (SIGSEGV) на 0x636f7d89 (код = 1). Как его можно отследить? Уровень API Android <19 и «попытка использования автоматического управления ресурсами» StartForeground вызывает проблемы с кордорой Можно ли делать настоящие HTTP-запросы с robolectric Ошибка детализации дочерней службы Play Service Внутреннее хранилище виртуального устройства Android 4.4 не изменяет размер Черный текст на темном фоне на Нуге (android.R.layout.simple_spinner_item) Как я могу безопасно управлять транзакциями транзакций в приложении на внешнем сервере? Какое Android-устройство следует покупать для разработки приложений для Android? Когда использовать поставщика контента Доступ Запуск службы и вызов ее метода? Почему onPostExecute выполняется до doInBackground в AsyncTask Масштабирование проблемы на Android – почему картина такая неуклюжая? Поддерживает ли эмулятор Android OpenGL ES 3.0?

MediaStore.Images.Thumbnails.getThumbnail возвращает неверный миниатюру вместо NULL

Рассмотрим сценарий, как на картинке:

Родная галерея

Три фотографии, один из которых – большой GIF-файл (3MP).

Я запрашиваю MediaStore, чтобы получить соответствующие миниатюры. Если я инициализирую курсор через CursorLoader с помощью этого sortOrder:

MediaStore.Images.Media.DATE_ADDED + " DESC"" 

Что происходит: MediaStore возвращает предыдущий успешно полученный эскиз:

DESC

Ожидаемое поведение: когда MediaStore не может получить миниатюру данного изображения, по какой-то причине он должен вернуть NULL в соответствии с его Javadoc: «… Возвращает экземпляр Bitmap. Он может быть null, если исходное изображение, связанное с origId, не Существует или памяти недостаточно ».

Если я инициализирую курсор с помощью этого sortOrder:

 MediaStore.Images.Media.DATE_ADDED + " ASC"" 

Он работает отлично:

ASC

Однако я не могу просто изменить sortOrder, так как требование состоит в том, чтобы сначала показать самые новые фотографии.

Ниже приведен пример кода, и вот полный образец проекта, а также три изображения, используемые для воспроизведения .

 package com.example.getimagefrommediastore; import android.app.Activity; import android.database.Cursor; import android.graphics.Bitmap; import android.os.Bundle; import android.provider.MediaStore; import android.support.v4.content.CursorLoader; import android.widget.ImageView; import android.widget.TextView; public class GetThumbnailsFromMediaStoreSampleActivity extends Activity { TextView mThumb_id_01; TextView mThumb_id_02; TextView mThumb_id_03; ImageView mImg_01; ImageView mImg_02; ImageView mImg_03; boolean isThumb01 = true; // Simple flag to control this example boolean isThumb02 = true; Cursor mCursorLoader; int mColumnIndex; long mOrigId; // Original image id associated with thumbnail of interest @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Just initializing views mThumb_id_01 = (TextView) findViewById(R.id.thumb_id_01); mThumb_id_02 = (TextView) findViewById(R.id.thumb_id_02); mThumb_id_03 = (TextView) findViewById(R.id.thumb_id_03); mImg_01 = (ImageView) findViewById(R.id.thumb_01); mImg_02 = (ImageView) findViewById(R.id.thumb_02); mImg_03 = (ImageView) findViewById(R.id.thumb_03); // Initializing CursorLoader mCursorLoader = initializeCursorLoader(); mColumnIndex = mCursorLoader.getColumnIndex(MediaStore.Images.Media._ID); // Go thru all the images in the device (EXTERNAL_CONTENT_URI) // In this example there are only three images for (int i = 0; i < mCursorLoader.getCount(); i++) { mCursorLoader.moveToPosition(i); mOrigId = mCursorLoader.getInt(mColumnIndex); // Update views chooseViewToUpdate(); } } private Cursor initializeCursorLoader() { String[] COLUMNS = { MediaStore.Images.Thumbnails._ID, MediaStore.Images.Media.DATA }; CursorLoader cursorLoader = new CursorLoader( GetThumbnailsFromMediaStoreSampleActivity.this, // Context MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // Uri COLUMNS, // Projection null, // Selection null, // Selection Args // Sort Order: DESC = newest first // Sort Order: ASC = oldest first MediaStore.Images.Media.DATE_ADDED + " DESC"); // *** NOTE *** // With: // // MediaStore.Images.Media.DATE_ADDED + " ASC" // // It runs just fine (MediaStore returns 'null' for invalid thumbnails) // The problem seems to reside on the " DESC" tag. // // How bizarre is that? return cursorLoader.loadInBackground(); } private void chooseViewToUpdate() { if (isThumb01) { updateUI(mThumb_id_01, mImg_01); isThumb01 = false; } else if (isThumb02) { updateUI(mThumb_id_02, mImg_02); isThumb02 = false; } else { updateUI(mThumb_id_03, mImg_03); } } private void updateUI(TextView textView, ImageView imgView) { textView.setText("ID:" + String.valueOf(mOrigId)); Bitmap mediaStoreThumbmail = MediaStore.Images.Thumbnails.getThumbnail( this.getContentResolver(), mOrigId, MediaStore.Images.Thumbnails.MICRO_KIND, null); if (mediaStoreThumbmail != null) { imgView.setImageBitmap(mediaStoreThumbmail); } } 

Я что-то упускаю? Кто-нибудь может понять, что может быть неправильным?

В любом случае, я набросился на Android .

РЕДАКТИРОВАТЬ

Похоже, эта проблема исправлена ​​в Lollipop. (Последний комментарий к этой теме).

Solutions Collecting From Web of "MediaStore.Images.Thumbnails.getThumbnail возвращает неверный миниатюру вместо NULL"

Я просто догадываюсь здесь. Когда вы запрашиваете MICRO_KIND, os создает новое изображение, которое снова входит в строку на курсе DESC, воспроизводя то же изображение снова.

Одна работа заключается в загрузке ArrayList для идентификатора изображения. Затем пойти за миниатюрами, работающими из ArrayList.

Возможность попробовать свой код с помощью MINI_KIND и bmoptions.inSampleSize = 2;

  final BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inSampleSize =2; Bitmap bm = MediaStore.Images.Thumbnails.getThumbnail( context.getContentResolver(), newImageId, MediaStore.Images.Thumbnails.MINI_KIND, bmOptions); 

Спустя три года, похоже, эта проблема исправлена ​​в Lollipop . (Последний комментарий к этой теме).
Поэтому я отвечаю на свой вопрос.