获取存储在 sd 卡 + android 中的图像的缩略图 Uri/路径
Posted
技术标签:
【中文标题】获取存储在 sd 卡 + android 中的图像的缩略图 Uri/路径【英文标题】:Get thumbnail Uri/path of the image stored in sd card + android 【发布时间】:2011-07-29 18:01:37 【问题描述】:SDK 版本 - 1.6
我正在使用以下意图打开 android 的默认图库:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(
Intent.createChooser(intent, "Select Picture"), 101);
现在在onActivityResult
,我可以得到所选图像的原始Uri和路径,但我无法获得所选图像缩略图的Uri和路径。
获取原图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) 我不想像 question 这样调整图像大小。我正在专门寻找由 android OS 本身生成的缩略图。
2) 使用 SDK 1.6 版,因此对 ThumbnailUtils 类不感兴趣。
【问题讨论】:
【参考方案1】:看看下面的类
http://developer.android.com/reference/android/provider/MediaStore.Images.Thumbnails.html
【讨论】:
【参考方案2】:您可以使用它来获取缩略图:
Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(
getContentResolver(), selectedImageUri,
MediaStore.Images.Thumbnails.MINI_KIND,
(BitmapFactory.Options) null );
有两种类型的缩略图可用: MINI_KIND:512 x 384 缩略图MICRO_KIND:96 x 96 缩略图
或者使用 [queryMiniThumbnails][1] 和几乎相同的参数来获取缩略图的路径。
编辑
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[])
【讨论】:
@karan:我尝试使用 getThumbnail,但它在 Eclipse 中显示错误,并显示“MediaStore.Images.Thumbnails”未定义的消息,但我检查了开发人员文档,它就在那里。知道为什么会这样吗?以及使用“queryMiniThumbnail”时如何获取缩略图的URi。 @mudit:确保您正在导入“android.provider.MediaStore”。我在答案中添加了 queryMiniThumbnail 示例。 但运行后,出现以下错误:"04-13 14:04:53.781: WARN/System.err(4703): android.database.sqlite.SQLiteException: no such column: kind: , 编译时:SELECT _id, _data, _size, _display_name, title, date_added, date_modified, mime_type, description, picasa_id, isprivate, latitude, longitude, datetaken,orientation, mini_thumb_magic, bucket_id, bucket_display_name FROM images WHERE (_id = 52) AND ( kind = 1) ORDER BY image_id ASC" 有什么想法吗? @mudit 对不起,我检查了答案,发现我们正在使用需要长格式 id 的 URI。请从 URI 中解析 id 并在我们使用 URI 的任何地方使用它(查看文档了解更多详细信息)。 @Karan 另一种方法“queryMiniThumbnails”需要 uri 而不是 id,但仍然报错:“android.database.sqlite.SQLiteException: no such column: kind..”【参考方案3】:根据@Karan 的回答和关注 cmets,仅针对到达这里的人(就像我一样)并需要准备工作的代码:
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;
【讨论】:
这里出现“column_id不存在”错误怎么处理?我已经阅读了一些关于它的帖子,但我们不是在这里自己创建 SQL 数据库......【参考方案4】:这可能是其他人在他们的回答中已经提到的另一种方法,但我发现获取缩略图的简单方法是使用ExifInterface
ExifInterface exif = new ExifInterface(pictureFile.getPath());
byte[] imageData=exif.getThumbnail();
Bitmap thumbnail= BitmapFactory.decodeByteArray(imageData,0,imageData.length);
【讨论】:
在使用这段代码时要小心 NPE,因为如果没有缩略图,getThumbnail() 会返回 null。【参考方案5】:两个没有贬低方法的变体。
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;
【讨论】:
这里出现“column_id不存在”错误怎么处理?我已经阅读了一些关于它的帖子,但我们不是在这里自己创建 SQL 数据库......【参考方案6】:This 解决方案对我有用!
final int THUMBSIZE = 128;
Bitmap thumbImage = ThumbnailUtils.extractThumbnail(
BitmapFactory.decodeFile(file.getAbsolutePath()),
THUMBSIZE,
THUMBSIZE);
【讨论】:
是的,但是对于数组位图 > 10 来说它太慢了 :)【参考方案7】: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;
【讨论】:
【参考方案8】:接受的答案对我不起作用。我使用以下方法制作:
try
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver(), uri);
Bitmap thumbBitmap = ThumbnailUtils.extractThumbnail(bitmap,120,120);
// imageView.setImageBitmap(thumbBitmap);
catch (IOException ex)
//......
【讨论】:
这也是我唯一可行的方法。但不太确定效率,因为它基本上是从给定的位图创建缩略图,而不是检索现有的。【参考方案9】:获取缩略图和所有 Android 版本的最佳答案是:
val thumbnail: Bitmap = if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q))
mContentResolver.loadThumbnail(contentUri, Size.parseSize(""), null)
else
MediaStore.Images.Thumbnails.getThumbnail(mContentResolver, id, MediaStore.Images.Thumbnails.MINI_KIND, null)
【讨论】:
以上是关于获取存储在 sd 卡 + android 中的图像的缩略图 Uri/路径的主要内容,如果未能解决你的问题,请参考以下文章
Android:给定原始图像的Uri,获取SD卡上图像的缩略图