Извлеките изображение, не кэшированное 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.