如何从图片的缩略图路径获取图片路径?

3

我正在尝试根据缩略图路径获取图像路径,我已经尝试过来自android-getting-path-to-image-from-thumbnail的解决方案,但它基于网格视图位置,而我只检索特定图像。此外,我在SO中找到了一个样例代码,该代码为:

private String getImagePathFromThumbPath(String thumbPath)
    {
        String imgPath=null;

//      String[] projection = new String[] {MediaStore.Images.Thumbnails._ID, MediaStore.Images.Thumbnails.IMAGE_ID};
        String[] imagesDataPath={ MediaStore.Images.Media.DATA ,MediaStore.Images.Media._ID};
            //mResolver.query() requires android API 16
        Cursor thumbnails = mResolver.query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, imagesDataPath,MediaStore.Images.Thumbnails.DATA+"=?",new String[]{thumbPath}, null, null);

        String[] filePathColumn = {MediaStore.Images.Media.DATA};

        Cursor imageCursor = mResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, filePathColumn, MediaStore.Images.Media._ID + "=?", new String[] {thumbId}, null);

        if (imageCursor != null && imageCursor.moveToFirst()) {
            // Your file-path will be here
            imgPath= imageCursor.getString(imageCursor.getColumnIndex(filePathColumn[0]));
        }
        return imgPath;
    }

上述方法稍作修改以适应我的需求,它在 Toasting 时不返回任何内容,请告诉我如何使用缩略图路径检索图片路径?
1个回答

6
经过长时间的不断尝试,终于找到了解决方案。 1. 您需要在缩略图表中查找图像唯一标识符(即图像 ID),并从图像表中查询缩略图提供程序 (MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI)。如果您不理解,请参考此处,具体而言是IMAGE_ID步骤 1 是获取retrievedImageId
retrievedImageId = Long.parseLong(cursor.getString(imageIdInImages));

2. 现在使用 retrievedImageId 获取图像路径,再次查询内容提供程序,但这次查询 Images 媒体提供程序 (MediaStore.Images.Media.EXTERNAL_CONTENT_URI)。

String getImagePathFromThumbPath(String thumbPath)
    {
        String imagePath = null;

        if(thumbPath != null )
        {
            String[] columns_to_return = {MediaStore.Images.Thumbnails.IMAGE_ID};
            String where = MediaStore.Images.Thumbnails.DATA+" LIKE ?";
            long retrievedImageId = -1;
            String valuesAre[] = {"%"+thumbPath};
            Cursor cursor = getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, columns_to_return, where, valuesAre, null);
            if(cursor != null)
            {           
                int imageIdInImages = cursor.getColumnIndex(MediaStore.Images.Thumbnails.IMAGE_ID);

                for (cursor.moveToFirst();!cursor.isAfterLast(); cursor.moveToNext()) 
                {
                       //STEP 1 to retrieve image ID
                   retrievedImageId = Long.parseLong(cursor.getString(imageIdInImages));
                }

                if(retrievedImageId != -1)
                {
                    // STEP 2 Now
                    Log.i(TAG, "imageId-" + retrievedImageId);
                    String[] columnsReturn = {MediaStore.Images.Media.DATA};
                    String whereimageId = MediaStore.Images.Media._ID+" LIKE ?";
                    String valuesIs[] = {"%" + retrievedImageId};
                    Cursor mCursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columnsReturn, whereimageId, valuesIs, null);
                    int rawDataPath= mCursor.getColumnIndex(MediaStore.Images.Media.DATA);
                    for (mCursor.moveToFirst();!mCursor.isAfterLast(); mCursor.moveToNext()) 
                    {
                        imagePath = mCursor.getString(rawDataPath);
                    }
                }
            }
        }   

        return imagePath;
    }

如果您仍然有疑问或错误/异常,请留下评论!

“EXTERNAL_CONTENT_URI”究竟是用来做什么的?它是用于所有应用程序都可以使用的内容,因此它们不需要权限吗?另外,如果通过意图从您的应用程序之外获得URI,您如何知道其来源(发送它的应用程序)以及它是否具有任何额外信息(例如所需时间等)? - android developer
我得到了路径,但它是不同的图像。 - Calvin
@calvin:你传递的是什么ID?你确定它是不同的图像吗?如果太长,可以基于此提出另一个问题。 - Akhil Jain
@AkhilJain 我在以下链接发布了问题:http://stackoverflow.com/questions/29839329/get-reference-of-actual-image-from-mediastore-images-thumbnails-table - Calvin
@AkhilJain:在棒棒糖上运行得非常完美,但在4.1.2上不行 :( - Calvin

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