MediaStore.Images.Thumbnails.getThumbnail vuelve miniatura mal en lugar de NULL

votos
11

Considere el escenario como en esta imagen:

nativo

Tres fotos, una de ellas es un archivo GIF grande (3MP).

Estoy consultar MediaStore el fin de recuperar las miniaturas correspondientes. Si inicializar el cursor a través de CursorLoader con este sortOrder:

MediaStore.Images.Media.DATE_ADDED +  DESC

Lo que sucede: MediaStore devuelve la anterior miniatura recuperado correctamente:

DESC

Comportamiento esperado: cuando MediaStore no puede recuperar la miniatura de una imagen dada por alguna razón tiene que devolver NULL, según su Javadoc: . ... Devuelve una instancia de Bitmap Podría ser nulo si la imagen original asociado con origId no lo hace existe o la memoria no es suficiente .

Si inicializar el cursor con esta sortOrder:

MediaStore.Images.Media.DATE_ADDED +  ASC

Se ejecuta muy bien:

ASC

Sin embargo, no puede cambiar simplemente los sortOrder ya que el requisito es para mostrar las imágenes más recientes en primer lugar.

A continuación se muestra el código de muestra y aquí está el proyecto de ejemplo completo , así como las tres imágenes que se utilizan para reproducirse .

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

¿Me estoy perdiendo de algo? ¿Alguien tiene una idea de lo que puede estar mal?

Llené un error contra Android de todos modos .

EDITAR

Parece que este problema se soluciona en Lollipop. (La última observación sobre ese hilo).

Publicado el 30/11/2012 a las 20:33
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

I "m sólo una suposición aquí. Cuando se le pregunta por el MICRO_KIND el sistema operativo es la creación de una nueva imagen, que se sigue en la línea de DESC cursor de la producción de la misma imagen de nuevo.

Una solución es cargar un ArrayList de la década de ID de la imagen. A continuación, para ir después de las imágenes en miniatura de trabajo de la ArrayList.

Posibilidad de probar su código utilizando el MINI_KIND y 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);
Respondida el 16/09/2014 a las 06:48
fuente por usuario

votos
0

Después de tres años, parece que este problema se soluciona en Lollipop . (La última observación sobre ese hilo).
Por lo tanto, voy a responder a mi propia pregunta.

Respondida el 12/03/2017 a las 20:42
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more