2014-02-11 84 views
14

我有一個相當大的圖像URL列表,我正在使用Picasso加載ViewPager。我需要能夠通過意向爲這些圖像提供共享功能(最終通過ShareActionProvider共享)。從我讀過的內容來看,畢加索並不是真正能夠處理這種開箱即用的事情,儘管它提供了所有必要的工具。從畢加索獲取圖像uri?

我在研究之前的計劃是創建一個簡單的LruCache,它使用url作爲鍵和位圖值。這種緩存將通過通過畢加索的Target接口發生。無論何時我想共享圖像,我都會檢查位圖的緩存。如果它不在那裏,我會去找畢加索。既然我有一個緩存的位圖不管,我會寫入一個文件(...這部分看起來不正確,但我必須寫一個文件來獲得一個uri,對吧?)並添加文件uri意圖。

但是我看到,與Picasso.Builder我可以設置(並保留一個引用)我自己的緩存 - https://stackoverflow.com/a/18552559/413254。這意味着我可以做掉與自定義Target和混亂,在正確實施hashCodeequals方法,以確保準確回收,檢索等

我的問題是,如何畢加索使用此緩存?關鍵是什麼?有沒有辦法在沒有寫入磁盤的情況下獲得位圖Uri?

+0

畢加索將存儲請求中的密鑰。密鑰是使用URL和所有唯一的轉換鍵(例如調整大小,旋轉和自定義轉換)構建的。 – dnkoutso

+0

你好@loeschg你有這個解決方案嗎?我使用OkHttpDownloader的Picasso加載SD卡中的圖像。我想獲得具有給定網址的圖像uri。你能分享我的代碼嗎? – Noundla

+0

@Noundla不幸的是,我不相信我做過。我可能已經使用了我自己的LruCache並從中抓住了它。它已經過了一段時間了。(ツ)_ /¯ – loeschg

回答

0

如果您想使用ShareActionProvider在當前頁面上共享圖像,則不必保留自己的圖像緩存。但爲了能夠將它分享給其他人,圖像應該位於設備上的共享文件系統中。

,如果你如果你想使用畢加索(這是一個很好的決定)利用圖片加載庫與自定義磁盤緩存的支持像Universal Image Loader

這將是更好。

您必須在每次更改頁面時保存圖像的副本,這也不是一個好選擇。

或者您可以給Picasso一個自定義網絡處理程序併爲其設置自定義緩存實現。我會建議使用帶有自定義緩存的OkHttp,該緩存以您需要的格式存儲文件。當你這樣做時,你必須有一個函數將圖像URL轉換爲設備上的文件路徑。

如果您在ViewPager的內部有Fragment,請在的碎片中進行更改。

獲取onCreateOptionsMenuShareActionProvider的參考。然後用你得到的文件路徑設置意圖。

Intent shareIntent = new Intent(Intent.ACTION_SEND); 
Uri phototUri = Uri.parse(Utils.getFilePath(imageUrl)); 
shareIntent.setData(phototUri); 
shareIntent.setType("image/png"); 
shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri); 
mShareActionProvider.setShareIntent(intent); 

編輯: 另一種選擇,我寧願是溝ShareActionProvider和使用普通的菜單項這一點。 ShareActionProvider的問題在於,您必須先將分享Intent準備好供用戶分享。即使用戶不會共享,也必須做好準備。

但是,當你有一個正常的按鈕,它更容易,因爲你只有當用戶點擊共享按鈕時進行操作。在這種情況下,您可以簡單地從PicassoTarget對象再次請求圖像,並將您獲得的Bitmap寫入共享外部文件系統中的文件並共享。