在SD卡中存储的图像如何获取缩略图的Uri/路径 + Android

26

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

注:1)我不是要像这个问题中那样调整图像大小。我特别寻找由Android操作系统生成的缩略图。

2)使用SDK版本1.6,因此不对ThumbnailUtils类感兴趣。

9个回答

86
您可以使用这个来获取缩略图:
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[])


1
@karan:我尝试使用getThumbnail,但在Eclipse中出现错误,显示“MediaStore.Images.Thumbnails”未定义,但我已经在开发人员文档中查看了它的存在。有何想法为什么会发生这种情况?当使用queryMiniThumbnail时如何获取缩略图的URI? - mudit
@mudit:请确保导入了“android.provider.MediaStore”。我在答案中添加了queryMiniThumbnail示例。 - Karan
6
但是在运行后,它会给出以下错误信息:"04-13 14:04:53.781: WARN/System.err(4703): android.database.sqlite.SQLiteException: no such column: kind: , while compiling: 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
3
抱歉,我检查了答案,发现我们使用的是需要长格式ID的URI。请从URI中解析出ID,并在使用URI的任何地方使用它(有关详细信息,请参阅文档)。 - Karan
2
@Karan 另一种方法 "queryMiniThumbnails" 需要 uri 而不是 id,但仍然出现错误:"android.database.sqlite.SQLiteException: no such column: kind.." - wangqi060934
显示剩余2条评论

12

这个 解决方案对我有效!

final int THUMBSIZE = 128;

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

是的,但对于数组位图> 10,速度非常慢 :) - Bokili Production

8

其他人已经在他们的答案中提到了另一种替代方法,但我发现获取缩略图的简单方法是使用ExifInterface

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

2
使用此代码片段时要小心NPE,因为如果没有缩略图,getThumbnail()将返回null。 - Torsten Ojaperv

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

如何处理这里的“列_id不存在”的错误?我已经阅读了一些相关帖子,但我们在这里并没有创建SQL数据库... - jesses.co.tt
这个解决方案中有几个错误。 - Simon

4

基于@Karan的回答和评论,为那些需要一个可用代码的人们(就像我一样)提供以下代码:

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
如何处理这里的“列_id不存在”的错误?我已经阅读了一些相关帖子,但我们在这里并没有创建SQL数据库... - jesses.co.tt

3
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
接受的答案对我不起作用。我使用以下方法来实现它:
    try{
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver(), uri);
        Bitmap thumbBitmap = ThumbnailUtils.extractThumbnail(bitmap,120,120);
        // imageView.setImageBitmap(thumbBitmap);
    }
    catch (IOException ex){
        //......
    }

这也是我唯一的方法。但效率方面不太确定,因为它基本上是从给定的位图创建缩略图,而不是检索现有的缩略图。 - KMC

-1
获取缩略图和所有 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)
}

什么是ID参数? - Hussien Fahmy
这是图像的ID - 即MediaStore.Images.Media._ID。 - odlh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接