Я пытаюсь получить путь к изображению на основе пути к миниатюре, я уже пробовал решение от android-getting-path-to-image-from-thumbnail, но он основан на позиции gridview, я получаю только определенные изображения. Также я нашел один образец кода из 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;
    }

Вышеупомянутый метод немного изменен в соответствии с моими потребностями, и он ничего не возвращает при тостах, расскажите, пожалуйста, как получить путь к изображению с помощью пути к миниатюрам?

3
Akhil Jain 21 Мар 2013 в 17:27

1 ответ

Лучший ответ

После долгих и неустанных попыток решение уже здесь

1. Вам нужно найти идентификатор изображения, который является уникальным идентификатором изображения из таблицы изображений в таблице эскизов, запросить поставщик эскизов (MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI), если вы его не понимаете, обратитесь к здесь, в частности IMAGE_ID,

Шаг 1 - получить retrievedImageId.

retrievedImageId = Long.parseLong(cursor.getString(imageIdInImages));

2. Теперь, используя retrievedImageId, получите путь к изображению, снова запросив поставщика содержимого, только на этот раз запросите поставщик мультимедиа изображений (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;
    }

Если у вас остались сомнения или ошибка / исключение, оставьте комментарий!

6
marc_s 30 Янв 2020 в 00:42
Для чего именно используется EXTERNAL_CONTENT_URI? это для контента, который доступен для всех приложений, следовательно, им не нужны разрешения? Кроме того, учитывая URI извне вашего приложения (через намерение), как вы можете узнать его источник (приложение, которое его отправило), и есть ли у него дополнительная информация (затраченное время и т. Д.)?
 – 
android developer
28 Окт 2014 в 15:33
Я получаю путь, но это другой образ.
 – 
Calvin
23 Апр 2015 в 16:16
@calvin: какой id ты проходишь? Вы уверены, что это другое изображение. Не стесняйтесь задать другой вопрос на его основе, если он будет слишком длинным.
 – 
Akhil Jain
23 Апр 2015 в 16:35
Я разместил вопрос по адресу: stackoverflow.com/questions/29839329/…
 – 
Calvin
24 Апр 2015 в 08:23
@AkhilJain: он отлично работает с леденцом на палочке. но не на 4.1.2 :(
 – 
Calvin
24 Апр 2015 в 09:31