Obtenir la vignette Uri / chemin de l'image stockée dans la carte sd + android

version SDK-1.6

j'utilise l'intention suivante pour ouvrir la galerie par défaut d'android:

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

Maintenant onActivityResult , je suis en mesure d'obtenir l'Uri originale et le chemin d'accès de l'image sélectionnée, mais je ne suis pas en mesure d'obtenir l'Uri et le chemin de la vignette de l'image sélectionnée.

Code pour obtenir L'Uri de l'image originale et le chemin:

@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) Je ne suis pas vous cherchez à redimensionner l'image comme ceci question . Je cherche spécifiquement les vignettes qui sont générées par android OS lui-même.

2) en utilisant la version 1.6 de SDK donc pas intéressé par ThumbnailUtils classe.

21
demandé sur Community 2011-04-05 11:36:07

8 réponses

vous pouvez utiliser ceci pour obtenir la vignette:

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

il existe deux types de vignettes disponibles:

MINI_KIND: 512 x 384 vignette

MICRO_KIND: 96 x 96 vignette

ou utilisez [queryMiniThumbnails][1] avec presque les mêmes paramètres pour obtenir le chemin de la vignette.

MODIFIER

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

79
répondu Karan 2017-03-23 14:45:01

Ce la solution est de travailler sur moi!

final int THUMBSIZE = 128;

Bitmap thumbImage = ThumbnailUtils.extractThumbnail(
                         BitmapFactory.decodeFile(file.getAbsolutePath()), 
                         THUMBSIZE, 
                         THUMBSIZE);
8
répondu Mete 2017-05-23 11:54:50

il pourrait être une alternative comme d'autres avaient déjà mentionné dans leur réponse, mais la manière facile j'ai trouvé pour obtenir vignette est d'utiliser ExifInterface

ExifInterface exif = new ExifInterface(pictureFile.getPath());
byte[] imageData=exif.getThumbnail();
Bitmap  thumbnail= BitmapFactory.decodeByteArray(imageData,0,imageData.length);
7
répondu dharam 2014-05-28 05:40:50

deux variantes sans méthodes dépricées.

 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;
}
5
répondu uberchilly 2014-06-10 08:14:08

basé sur la réponse de @Karan et les commentaires suivants, juste pour les gens qui arrivent ici (comme moi) et ont besoin d'un code prêt-à-travailler:

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;
}
3
répondu Juan Sánchez 2014-03-14 13:37:22
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;
}
2
répondu susemi99 2015-05-06 06:25:49

la réponse acceptée ne fonctionne pas pour moi. J'utilise la méthode suivante pour le faire:

    try{
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver(), uri);
        Bitmap thumbBitmap = ThumbnailUtils.extractThumbnail(bitmap,120,120);
        // imageView.setImageBitmap(thumbBitmap);
    }
    catch (IOException ex){
        //......
    }
0
répondu Yun CHEN 2017-05-07 16:45:50