2012-06-07 1 views
10

Мое приложение вызова галереи с намерением, что выглядит следующим образом:Извлеките изображение, не кэшированное 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 содержит Ури как ...

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

но при выборе PICASA изображения УИР что-то подобное. ..

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

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

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

getContentprovider().openInputStream(uri) 

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

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

T мотки !!

+0

Наконец закончился классическим решением ... С помощью Document.util, которая охватывает все полномочия: - http://stackoverflow.com/a/30453641/1384010 –

ответ

2

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

применяя некоторое отображение к содержимому провайдера URI ...

содержание: //com.google.android. gallery3d.provider/Picasa/элемент/5703943700733980450

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

пункт => PHOTOID имя ?? альбумид ??

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

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

API требует

Имя ALBUMID PHOTOID

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

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

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

php picasa api show large image

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

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

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

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

также имя на счете 'rowntreerob' и я знаю, что PhotoID 5703943700733980450 принадлежит ALBUMID 5703943611411433905.

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

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

и проверить ответ для текстового значения

«СМИ $ группа»: { «медиа-контента $»: [{ «URL»:

значение = https://lh3.googleusercontent.com/-_FFMNGPU1TQ/TtukXyN4eCI/AAAAAAAACso/EzPmut2iKVQ/DSC01612.JPG

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


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

+0

да ... Ьс это должно быть нашей работой как разработчики делают все это. думаю, нет . это googles fck up, а не devs – ChuckKelly

7

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

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

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


примечание, связанные с этой

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

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

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

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

Смежные вопросы