2012-06-07 43 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圖片的URI是一樣的東西。 ..

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

我讀了很多關於這個問題,我嘗試了很多解決方法。

此刻,我可以得到僅使用高速緩存的圖像:

getContentprovider().openInputStream(uri) 

的問題是,當圖像沒有被緩存,該openInputStream(URI)方法,將引發FileNotFoundException異常,我不能獲取圖像:_(

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

ŧ漢克斯!

+0

最後採用了經典的解決方案結束......通過使用Document.util,涵蓋了所有權威: - http://stackoverflow.com/a/30453641/1384010 –

回答

2

另一種方式來獲得該圖片的比特流是通Picasa的API ....

應用一些映射到內容提供商的URI ...

內容://com.google.android。 gallery3d.provider/Picasa的/項目/ 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。我不認爲。在picasa中AFAIK,您需要用戶,專輯,照片的元組得到一個參考的照片錄入和照片條目在API元素的大照片的網址:

「媒體$組」:{ 「媒體$內容」: {「URL」 :

如果相冊的可見度是公開的,則可以使用http(s)獲取url屬性的textvalue並請求它。響應是JPG的二進制流。

php picasa api show large image

看到上面的鏈接瞭解如何吸引你通過Picasa API所需圖像的詳細信息接受的答案。

使用我自己的內容的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

API請求

並檢查文字值的響應爲

「媒體$組」:{ 「媒體內容$」:[{ 「URL」:

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

我讓使用上述值的照片圖像請求和我的圖像。


畫廊3D應用程序也有代碼,你可以叉,因爲它徘徊無論檢測到縮略圖列表中的一個「觸摸」,將其委託給ContentProvider的接口來「得到」的BMP。我相信這個接口封裝了上面提到的所有血腥實現。通過要求ContentProvider生成BMP,開發人員不必擔心實現的風格?在thumbtouch上,Gallery3d可能會要求提供程序返回BMP及其提供程序實例,該實例負責解析緩存的各種狀態以及是否需要網絡調用來返回BMP。

+0

啊... BC應該是我們作爲工作開發人員做所有這些大聲笑。我想不是 。這是谷歌,而不是開發者 – ChuckKelly

7

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

背後使用ACTION_GET_CONTENT在您的畫廊選擇一個圖像,而不是使用ACTION_PICK,指着ImageStore的URI提供商的原因是ACTION_GET_CONTENT很好的支持,而ACTION_PICK。 Android Framework工程師多次致力於mentioned

我學會了很難的方法。在瞭解這個之前,我必須處理各種不一致的問題。


與此相關的

記下您應該總是使用openInputStream獲得文件通過ContentResolver與接受,而不是試圖獲得該文件被存儲的真實路徑的URI。很可能是ContentProvider實施由雲服務支持(Picasa就是這種情況),或者實施細節隨時間而改變。

Android的內容提供商讓您能夠抽象如何訪問數據。試圖找出文件所在的位置是我看到的常見錯誤。通常建議通過查詢給定的URIDATA列來查找位置。根據使用的ContentProvider,它可能會返回不同的內容,甚至會隨着新版本的不同而改變。

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

我知道OP使用的是openInputStream,但其他的答案是另有建議,這是我看到太頻繁。