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.
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 [])
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);
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;
}
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;
}
regardez la classe suivante
http://developer.android.com/reference/android/provider/MediaStore.Images.Thumbnails.html
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 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){
//......
}