MediaStore.Images.Thumbnails.getThumbnail gibt anstelle von NULL ein falsches Thumbnail zurück

Betrachten Sie das Szenario wie in diesem Bild:

Drei Fotos, eines davon ist eine große GIF-Datei (3 MP).

Ich frage MediaStore ab, um die entsprechenden Miniaturansichten abzurufen. Wenn ich den Cursor über CursorLoader mit dieser Sortierreihenfolge initialisiere:

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

Was geschieht: MediaStore gibt die zuvor erfolgreich abgerufene Miniaturansicht zurück:

Erwartetes Verhalten: Wenn MediaStore die Miniaturansicht eines bestimmten Bildes aus irgendeinem Grund nicht abrufen kann, muss es NULL gemäß seinem Javadoc zurückgeben:"... Gibt eine Bitmap-Instanz zurück. Sie kann null sein, wenn das mit origId verknüpfte Originalbild nicht vorhanden ist oder der Speicher nicht ausreicht."

Wenn ich den Cursor mit dieser Sortierreihenfolge initialisiere:

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

Es läuft gut:

Allerdings kann ich die Sortierreihenfolge nicht einfach ändern, da zuerst die neuesten Bilder angezeigt werden müssen.

Unten ist mein Beispielcode undHier ist das komplette Beispielprojekt ebenso gut wieDie drei zur Reproduktion verwendeten Bilder.

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);
    }
}

Vermisse ich etwas? Hat jemand eine Idee woran das liegen könnte?

Ich habe trotzdem einen Fehler gegen Android behoben.

BEARBEITEN

Es scheint, dass dieses Problem istin Lollipop behoben. (Der letzte Kommentar zu diesem Thread).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage