获取存储在 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卡上图像的缩略图

Android获取外置SD卡存储路径的方法

Android开发之sd卡存储和机身存储的路径获取

Android - 将图像从 URL 保存到 SD 卡

Android设备网络屏幕尺寸SD卡本地IP存储空间等信息获取工具类

Android 将位图保存到 SD 卡