2011-04-05 18 views
20

SDK - 1.6consigo miniatura Uri/ruta de la imagen almacenada en la tarjeta SD + android versión

estoy usando seguir la intención de abrir la galería por defecto de Android:

Intent intent = new Intent(); 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       startActivityForResult(
         Intent.createChooser(intent, "Select Picture"), 101); 

Ahora en onActivityResult, i puedo obtener el URI original y la ruta de la imagen seleccionada, pero no puedo obtener el Uri y la ruta de la miniatura de la imagen seleccionada.

Código

para obtener la imagen original y la ruta Uri:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     try { 

      if (requestCode == 101 && data != null) { 

       Uri selectedImageUri = data.getData(); 
       String selectedImagePath = getPath(selectedImageUri); 
} else { 
       Toast toast = Toast.makeText(this, "No Image is selected.", 
         Toast.LENGTH_LONG); 
       toast.show(); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(uri, projection, null, null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 

     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

PS: 1) No estoy buscando para cambiar el tamaño de imagen como esta question. Estoy buscando específicamente las miniaturas generadas por el propio sistema operativo Android.

2) El uso de la versión 1.6 de SDK no está interesado en la clase ThumbnailUtils.

+0

alguien aquí ??? – mudit

Respuesta

77

Puede utilizar esto para conseguir la miniatura:

Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnails(
          getContentResolver(), selectedImageUri, 
          MediaStore.Images.Thumbnails.MINI_KIND, 
          (BitmapFactory.Options) null); 

Hay dos tipos de imágenes en miniatura disponibles:
MINI_KIND: 512 x 384 thumbnail
MICRO_KIND: 96 x 96 thumbnail

O use [queryMiniThumbnails] [1] con casi los mismos parámetros para obtener la ruta de la miniatura.

EDITAR

Cursor cursor = MediaStore.Images.Thumbnails.queryMiniThumbnails(
          getContentResolver(), selectedImageUri, 
          MediaStore.Images.Thumbnails.MINI_KIND, 
          null); 
if(cursor != null && cursor.getCount() > 0) { 
    cursor.moveToFirst();//**EDIT** 
    String uri = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA)); 
} 

HTH!

[1]: https://developer.android.com/reference/android/provider/MediaStore.Images.Thumbnails.html#queryMiniThumbnails(android.content.ContentResolver, android.net.Uri, int, java.lang.String [])

+0

@karan: intenté usar getThumbnail pero está mostrando un error en Eclipse con un mensaje que no está definido para "MediaStore.Images.Thumbnails" pero lo revisé en los documentos del desarrollador, está allí. ¿Alguna idea de por qué está pasando esto? Y cómo obtener el URi de la miniatura al usar "queryMiniThumbnail". – mudit

+0

@mudit: asegúrese de estar importando "android.provider.MediaStore". He agregado el ejemplo queryMiniThumbnail en respuesta. – Karan

+0

@karan: estoy importando "android.provider.MediaStore", pero sigue dando una línea roja debajo de la función "getThumbnail". Además, como en su código "queryMiniThumbnail" también está dando error: que no es aplicable para esto. Así que lo cambié a "queryMiniThumbnails" y compiló el código. – mudit

2

Basado en respuesta @ y siguientes comentarios de Karan, sólo para las personas que llegan aquí (como lo hice) y la necesidad de un código de lista para el trabajo:

public String getThumbnailPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media._ID }; 
    String result = null; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media._ID); 

    cursor.moveToFirst(); 
    long imageId = cursor.getLong(column_index); 
    cursor.close(); 

    cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(
      getContentResolver(), imageId, 
      MediaStore.Images.Thumbnails.MINI_KIND, 
      null); 
    if (cursor != null && cursor.getCount() > 0) { 
     cursor.moveToFirst(); 
     result = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA)); 
     cursor.close(); 
    } 
    return result; 
} 
+1

¿Cómo lidiar con el error "la columna _id no existe" aquí? He leído algunas publicaciones al respecto, pero no estamos creando una base de datos SQL aquí ... –

6

podría ser un formas alternativas como otro ya había mencionado en su respuesta, pero Fácil manera que he encontrado para conseguir miniatura está utilizando ExifInterface

ExifInterface exif = new ExifInterface(pictureFile.getPath()); 
byte[] imageData=exif.getThumbnail(); 
Bitmap thumbnail= BitmapFactory.decodeByteArray(imageData,0,imageData.length); 
+1

Tenga cuidado con NPE al usar este código, ya que getThumbnail() devuelve nulo si no hay una miniatura. –

5

Dos variantes sin métodos privados.

public String getThumbnailPath(Uri uri) { 
    String[] proj = { MediaStore.Images.Media.DATA }; 

    // This method was deprecated in API level 11 
    // Cursor cursor = managedQuery(contentUri, proj, null, null, null); 

    CursorLoader cursorLoader = new CursorLoader(activity, uri, proj, null, null, null); 
Cursor cursor = cursorLoader.loadInBackground(); 

    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); 

    cursor.moveToFirst(); 
    long imageId = cursor.getLong(column_index); 
    //cursor.close(); 
    String result=""; 
    cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(activity.getContentResolver(), imageId, 
      MediaStore.Images.Thumbnails.MINI_KIND, null); 
    if (cursor != null && cursor.getCount() > 0) { 
     cursor.moveToFirst(); 
     result = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA)); 
     cursor.close(); 
    } 
    return result; 
} 
public Bitmap getThumbnailBitmap(Uri uri){ 
    String[] proj = { MediaStore.Images.Media.DATA }; 

    // This method was deprecated in API level 11 
    // Cursor cursor = managedQuery(contentUri, proj, null, null, null); 

    CursorLoader cursorLoader = new CursorLoader(activity, uri, proj, null, null, null); 
    Cursor cursor = cursorLoader.loadInBackground(); 

    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); 

    cursor.moveToFirst(); 
    long imageId = cursor.getLong(column_index); 
    //cursor.close(); 

    Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(
      getContentResolver(), imageId, 
      MediaStore.Images.Thumbnails.MINI_KIND, 
      (BitmapFactory.Options) null); 

    return bitmap; 
} 
+0

cómo lidiar con el error "la columna _id no existe" aquí? He leído algunas publicaciones al respecto, pero no estamos creando una base de datos SQL aquí ... –

7

This solución es trabajar en mí!

final int THUMBSIZE = 128; 

Bitmap thumbImage = ThumbnailUtils.extractThumbnail(
         BitmapFactory.decodeFile(file.getAbsolutePath()), 
         THUMBSIZE, 
         THUMBSIZE); 
1
public static String getThumbnailPath(Context context, String path) 
{ 
    long imageId = -1; 

    String[] projection = new String[] { MediaStore.MediaColumns._ID }; 
    String selection = MediaStore.MediaColumns.DATA + "=?"; 
    String[] selectionArgs = new String[] { path }; 
    Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null); 
    if (cursor != null && cursor.moveToFirst()) 
    { 
    imageId = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); 
    cursor.close(); 
    } 

    String result = null; 
    cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(context.getContentResolver(), imageId, MediaStore.Images.Thumbnails.MINI_KIND, null); 
    if (cursor != null && cursor.getCount() > 0) 
    { 
    cursor.moveToFirst(); 
    result = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA)); 
    cursor.close(); 
    } 

    return result; 
} 
+0

Este es el único que funciona para mí. ¡¡Gracias!! – Ganesh

0

La respuesta aceptada no está funcionando para mí. Yo uso el siguiente método para hacerlo:

try{ 
     Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver(), uri); 
     Bitmap thumbBitmap = ThumbnailUtils.extractThumbnail(bitmap,120,120); 
     // imageView.setImageBitmap(thumbBitmap); 
    } 
    catch (IOException ex){ 
     //...... 
    } 
Cuestiones relacionadas