【问题标题】:Get thumbnail Uri/path of the image stored in sd card + android获取存储在 sd 卡 + android 中的图像的缩略图 Uri/路径
【发布时间】: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 类不感兴趣。

【问题讨论】:

    标签: android thumbnails


    【解决方案1】:
    【解决方案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)
      }
      

      【讨论】:

        猜你喜欢
        • 2011-06-22
        • 2012-03-05
        • 2012-01-13
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2020-03-26
        • 1970-01-01
        相关资源
        最近更新 更多