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

mud*_*dit 22 android thumbnails

SDK版本 - 1.6

我正在使用以下意图打开android的默认图库:

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

现在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);
    }
Run Code Online (Sandbox Code Playgroud)

PS:1)我不打算像这个问题调整图像大小.我特意寻找由android OS本身生成的缩略图.

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

Kar*_*ran 83

您可以使用它来获取缩略图:

Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(
                             getContentResolver(), selectedImageUri,
                             MediaStore.Images.Thumbnails.MINI_KIND,
                             (BitmapFactory.Options) null );
Run Code Online (Sandbox Code Playgroud)

有两种类型的缩略图:
MINI_KIND:512 x 384缩略图
MICRO_KIND:96 x 96 thumbnail

或者使用几乎相同参数的[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 ) );
}
Run Code Online (Sandbox Code Playgroud)

HTH!

[1]:https://developer.android.com/reference/android/provider/MediaStore.Images.Thumbnails.html#queryMiniThumbnails (android.content.ContentResolver,android.net.Uri,int,java.lang.String [ ])

  • 但运行后,它出现以下错误:"04-13 14:04:53.781:WARN/System.err(4703):android.database.sqlite.SQLiteException:没有这样的列: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 "任何想法? (5认同)
  • @mudit抱歉,我检查了答案,发现我们正在使用URI,其中需要长格式的id.请解析URI中的id并在我们使用URI的任何地方使用它(有关详细信息,请查看文档). (3认同)
  • @Karan另一个方法“queryMiniThumbnails”需要uri而不是id,但仍然收到错误:“android.database.sqlite.SQLiteException:没有这样的列:kind..” (2认同)

Met*_*ete 9

这个解决方案对我有用!

final int THUMBSIZE = 128;

Bitmap thumbImage = ThumbnailUtils.extractThumbnail(
                         BitmapFactory.decodeFile(file.getAbsolutePath()), 
                         THUMBSIZE, 
                         THUMBSIZE);
Run Code Online (Sandbox Code Playgroud)


dha*_*ram 7

它可能是其他方式已经在他们的答案中提到的替代方式,但我发现获取缩略图的简单方法正在使用 ExifInterface

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

  • 使用这段代码时要小心 NPE,因为如果没有缩略图,getThumbnail() 将返回 null。 (2认同)

ube*_*lly 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;
}
Run Code Online (Sandbox Code Playgroud)