簡體   English   中英

從Gallery中檢索非緩存的Picasa圖像。 3.0和4.0

[英]Retrieve a non cached Picasa image from Gallery. 3.0 and 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 ,我無法獲取圖像:_(

任何人都知道如何獲取文件或網址下載文件或東西來獲取圖像?

謝謝!!

正確的解決方案是使用ACTION_GET_CONTENT 它的名字可能聽起來不像ACTION_PICK那么直觀,但它應該用於你想要做的事情。

使用ACTION_GET_CONTENT選擇圖庫中的圖像而不是使用ACTION_PICK並指向ACTION_GET_CONTENT的URI提供程序的原因是ACTION_GET_CONTENT得到了很好的支持 ,而ACTION_PICK沒有 Android Framework工程師已經多次提到它。

我很難學到它。 在發現這一點之前,我不得不處理各種不一致問題。


與此相關的說明

您應始終使用openInputStream通過帶有URIContentResolver獲取文件,而不是嘗試獲取存儲文件的實際路徑。 很可能是ContentProvider實現由雲服務支持(Picasa就是這種情況),或者實現細節隨時間而變化。

Android的內容提供商允許您抽象數據的訪問方式。 試圖找出文件所在的位置是我看到的常見錯誤。 通常建議的是通過查詢給定URIDATA列來查找位置。 根據使用的ContentProvider它可能返回不同的東西,甚至隨着時間的推移隨新版本而變化。

通過使用openInputStream您不必關心文件的位置,您只需接收字節流並按照您的意願執行操作。 這樣,您就不會遇到支持來自Google Drive,Dropbox等其他應用程序的內容提供商的問題,這些應用程序提供類似的選擇器界面來選擇圖像。

我知道OP正在使用openInputStream ,但是其他的答案是建議的,這是我經常看到的。

獲取圖片比特流的另一種方法是通過picasa api ....

將一些映射應用於內容提供商uri ...

內容://com.google.android.gallery3d.provider/picasa/item/5703943700733980450

可以將它映射到picasa api,如下所示:

item => photoid name ?? ALBUMID?

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

以上是照片錄入的api請求 - 有關詳細信息,請參閱picasa文檔。

API要求

名稱albumID photoID

姓名我想你可以通過電話從帳戶中獲取。 AlbumID很棘手,因為內容提供商中的/ item / node值不是可以使用關系來推斷它所在的專輯的GUID。我不認為..在picasa中的AFAIK,你需要用戶,專輯,照片元組獲取對照片條目的引用,照片條目具有API元素中大照片的URL:

“media $ group”:{“media $ content”:[{“url”:

如果專輯的可見性是公開的,您可以使用url屬性的textvalue並使用http(s)請求它。 響應是JPG的二進制流。

php picasa api顯示大圖像

有關從picasa api獲取所需圖像的更多詳細信息,請參閱上述鏈接中的已接受答案。

在示例中使用我自己的內容URI之一...

內容://com.google.android.gallery3d.provider/picasa/item/5703943700733980450

在緩存中不可用,那么如何獲取圖像?

好吧,帳戶上的名字是'rowntreerob',我知道photoid 5703943700733980450屬於albumid 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

我使用上面的值制作照片圖像請求,我有圖像。


Gallery 3D應用程序還具有您可以分叉的代碼,因為無論它在縮略圖列表中檢測到“觸摸”,它都會委托給contentProvider界面以“獲取”BMP。 我相信這個接口封裝了上面提到的所有gory實現nits。 通過要求ContentProvider生成BMP,開發人員不必擔心實現的風格? 在縮略圖上,Gallery3d可能只是要求提供者返回BMP及其負責解析緩存各種狀態的提供者實例,以及是否需要網絡調用來返回BMP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM