Извлеките изображение, не кэшированное Picasa из галереи. 3.0 и 4.0

Мое приложение вызывает галерею с намерением, которая выглядит так:

Intent intent = new Intent(Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, SELECT_IMAGE_FROM_GALLERY);

В версиях < 3.0 нет проблем.

С версиями 3.0 и более, когда вы получаете локальное изображение, намерение в методе onActivityResult содержит Uri, как...

content://media/external/images/media/XXX

но когда вы выбираете образ picasa, uri - это что-то вроде...

content://com.google.android.gallery3d.provider/picasa/item/XXXXXXXXXXXXXXXXXXXXX

Я много читал об этой проблеме, и я пробовал много обходных решений.

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

getContentprovider().openInputStream(uri)

Проблема заключается в том, что когда изображение не кэшируется, метод openInputStream (uri) генерирует FileNotFoundException, и я не могу получить изображение: _ (

Кто-нибудь знает, как получить файл или URL-адрес, чтобы загрузить файл или что-то, чтобы получить изображение?

Спасибо!!

Ответ 1

Правильное решение - использовать ACTION_GET_CONTENT. Его имя может показаться не таким интуитивным, как ACTION_PICK, но это тот, который вы должны использовать для того, что вы пытаетесь сделать.

Причина использования ACTION_GET_CONTENT для выбора изображения в вашей галерее вместо использования ACTION_PICK и указания на провайдера URI ImageStore заключается в том, что ACTION_GET_CONTENT поддерживается , тогда как ACTION_PICK не. Это было упомянуто пару раз разработчиками Android Framework.

Я усвоил это с трудом. Прежде чем узнавать об этом, мне пришлось иметь дело с различными несоответствиями.


Заметка, связанная с этим

Вы всегда должны использовать openInputStream для получения файла через ContentResolver с полученным URI вместо того, чтобы пытаться получить реальный путь, в котором хранится файл. Вполне возможно, что реализация ContentProvider поддерживается облачной службой (в этом случае с Picasa), или детали реализации меняются со временем.

Поставщики контента Android позволяют анализировать способы доступа к данным. Попытка выяснить, где находится файл, является общей ошибкой, которую я вижу. Обычно предлагается найти местоположение, запросив столбец DATA данного URI. В зависимости от используемого ContentProvider он может возвращать разные вещи и даже со временем меняться с новыми версиями.

Используя openInputStream, вам не нужно заботиться о том, где находится файл, вы просто получаете поток байтов и делаете то, что хотите. Таким образом, у вас не будет проблем с поддержкой поставщиков контента из других приложений, таких как Google Диск, Dropbox и т.д., Которые предоставляют аналогичный интерфейс для выбора изображения.

Я знаю, что OP использует openInputStream, но другие ответы указывают на другое, и это то, что я вижу слишком часто.

Ответ 2

Другой способ получить битовый поток для изображения - через picasa api....

применяя некоторое сопоставление с провайдером контента uri...

Содержание://com.google.android.gallery3d.provider/picasa/item/5703943700733980450

можно сопоставить его с picasa api следующим образом:

Пункт = > PhotoID имя?? ALBUMID??

picasaweb.google.com/data/entry/api/user/$NAME/albumid/nnnn/photoid/nnnn

Выше - запрос api для ввода фотографий - подробности см. в документах picasa.

API требует

Имя ALBUMID PhotoID

Имя, которое я думаю, может получить из учетной записи на телефоне. AlbumID сложно, потому что значение /item/ node в провайдере контента не является идентификатором GUID, который может использовать отношения для вывода альбома, в котором он находится. Я не думаю.. AFAIK в picasa, вам нужен пользователь, альбом, фотокоррект, чтобы получить ссылку на запись с фотографией, а на входе с фотографией есть URL-адрес большой фотографии в элементе API:

"медиа $группа": {   "СМИ $содержание": [  { "URL":

Вы можете взять текстовое значение атрибута url и запросить его с помощью http (s), если видимость альбома будет общедоступной. Ответ представляет собой двоичный поток JPG.

php picasa api показать большое изображение

см. принятый ответ в приведенной выше ссылке для получения более подробной информации о получении изображения, которое вы хотите от picasa api.

Используя один из моих собственных URI контента в примере...

Содержание://com.google.android.gallery3d.provider/picasa/item/5703943700733980450

недоступен в кеше, так как получить изображение?

ну имя в учетной записи: "rowntreerob" и Я знаю, что фотоид 5703943700733980450 принадлежит к альбому 5703943611411433905.

Итак, я делаю запрос api для записи

https://picasaweb.google.com//data/entry/api/user/rowntreerob/albumid/5682316071017984417/photoid/5682316083381958690?fields=media%3Agroup%2Fmedia%3Athumbnail%5B%40url%5D%2Cmedia%3Agroup%2Fmedia%3Acontent%5B%40url%5D&alt=json

и проверьте ответ на текстовое значение

"media $group": { "media $content": [{ "url":

value = https://lh3.googleusercontent.com/-_FFMNGPU1TQ/TtukXyN4eCI/AAAAAAAACso/EzPmut2iKVQ/DSC01612.JPG

Я делаю запрос фотоизображения, используя значение выше, и у меня есть изображение.


В приложении "Галерея 3D" также есть код, который вы можете развить, потому что если он обнаруживает "прикосновение" к одному из списков эскизов, он делегирует интерфейс contentProvider для "получения" BMP. Я считаю, что этот интерфейс инкапсулирует все упомянутые выше gory-реализации. Прося ContentProvider для создания BMP, разработчику не нужно беспокоиться о вкусе реализации? В thumbtouch Gallery3d может попросить провайдера вернуть BMP и его экземпляр поставщика, который отвечает за разрешение различных состояний кеша, и потребуются ли сетевые вызовы для возврата BMP.