Obtener miniatura Uri / ruta de la imagen almacenada en tarjeta SD + Android

Versión SDK – 1.6

Estoy usando la siguiente intención para abrir la galería predeterminada 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 , puedo obtener el onActivityResult 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 Uri y la ruta:

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

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

2) Usar SDK versión 1.6 por lo que no está interesado en la clase ThumbnailUtils .

Puedes usar esto para obtener la miniatura:

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

Hay dos tipos de miniaturas disponibles:
MINI_KIND: 512 x 384 miniatura
MICRO_KIND: 96 x 96 miniatura

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 [ ]

¡Esta solución es trabajo para mí!

 final int THUMBSIZE = 128; Bitmap thumbImage = ThumbnailUtils.extractThumbnail( BitmapFactory.decodeFile(file.getAbsolutePath()), THUMBSIZE, THUMBSIZE); 

Podría ser una manera alternativa como otros ya han mencionado en su respuesta, pero la forma fácil que encontré para obtener una miniatura es usando ExifInterface

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

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

Basado en la respuesta de @ Karan y los siguientes comentarios, solo para las personas que llegan aquí (como yo) y necesitan un código listo para trabajar:

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

La respuesta aceptada no funciona 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){ //...... }