[英]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
通過帶有URI
的ContentResolver
獲取文件,而不是嘗試獲取存儲文件的實際路徑。 很可能是ContentProvider
實現由雲服務支持(Picasa就是這種情況),或者實現細節隨時間而變化。
Android的內容提供商允許您抽象數據的訪問方式。 試圖找出文件所在的位置是我看到的常見錯誤。 通常建議的是通過查詢給定URI
的DATA
列來查找位置。 根據使用的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的二進制流。
有關從picasa api獲取所需圖像的更多詳細信息,請參閱上述鏈接中的已接受答案。
在示例中使用我自己的內容URI之一...
內容://com.google.android.gallery3d.provider/picasa/item/5703943700733980450
在緩存中不可用,那么如何獲取圖像?
好吧,帳戶上的名字是'rowntreerob',我知道photoid 5703943700733980450屬於albumid 5703943611411433905。
所以,我為這個條目提出了api請求
並檢查文本值的響應
“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.