2014-02-11 9 views
14

Ich habe eine ziemlich große Liste von Bild-URLs, die ich verwende, um eine ViewPager mit Picasso laden. Ich muss in der Lage sein, für diese Bilder Freigabe-Funktionen über eine Absicht bereitzustellen (schließlich Freigabe über ShareActionProvider). Nach dem, was ich gelesen habe, ist Picasso nicht wirklich dafür ausgelegt, so etwas aus der Box zu handhaben, obwohl es alle notwendigen Werkzeuge dafür bietet.Erhalten Bild UI von Picasso?

Mein Plan vor der Forschung war es, eine einfache LruCache erstellen, die die URL als Schlüssel und Bitmap-Wert verwendet. Diese Zwischenspeicherung würde in onBitmapLoaded über Picassos Target Schnittstelle erfolgen. Wann immer ich ein Bild teilen möchte, überprüfe ich den Cache nach der Bitmap. Wenn es nicht da ist, hole ich mit Picasso. Jetzt, da ich noch eine zwischengespeicherte Bitmap habe, schreibe ich in eine Datei (... dieser Teil scheint nicht richtig zu sein, obwohl ich in eine Datei schreiben muss, um ein uri zu bekommen, oder?) Und füge die Datei uri hinzu die Absicht.

Allerdings sehe ich, dass ich mit der Picasso.Builder kann ich einen eigenen Cache setzen - und behalten einen Verweis auf - https://stackoverflow.com/a/18552559/413254. Dies bedeutet, dass ich mit richtig Umsetzung hashCode und equals Methoden mit dem benutzerdefinierten Target und Verwirrung beseitigen könnte genau das Recycling zu gewährleisten, Retrieval, usw.

Meine Frage ist, wie funktioniert Picasso diesen Cache verwenden? Was sind die Schlüssel? Gibt es eine Möglichkeit, eine Bitmap Uri zu bekommen, ohne sie auf die Festplatte zu schreiben?

+0

Picasso speichert den Schlüssel aus der Anfrage. Der Schlüssel wird mithilfe der URL und aller eindeutigen Umwandlungsschlüssel erstellt (z. B. Größenänderung, Drehung und benutzerdefinierte Transformationen). – dnkoutso

+0

Hi @loeschg hast du eine Lösung dafür bekommen? Ich verwende Picasso mit OkHttpDownloader, um die Bilder in SD-Karte zu laden. Ich möchte das Bild-URI mit der angegebenen URL erhalten. Kannst du mir bitte deinen Code mitteilen? – Noundla

+0

@Noundla Leider glaube ich nicht, dass ich es tat. Ich habe vielleicht meinen eigenen LruCache benutzt und habe ihn daraus geschnappt. Es war eine Weile ¯ \\ _ (ツ) _/¯ – loeschg

Antwort

0

Wenn Sie ShareActionProvider verwenden, um das Bild auf der aktuellen Seite zu teilen, müssen Sie keinen eigenen Bildercache behalten. Aber um es mit anderen teilen zu können, sollte das Bild im freigegebenen Dateisystem auf dem Gerät sein.

Es wäre besser, wenn Sie Bild das Laden von Bibliotheken mit benutzerdefinierten Festplatten-Cache-Unterstützung wie Universal Image Loader

verwenden Wenn Sie Picasso verwenden möchten (was eine gute Entscheidung ist).

Sie müssen entweder eine Kopie des Bildes bei jeder Seitenänderung speichern, was auch keine gute Option ist.

Oder Sie können einen benutzerdefinierten Netzwerk-Handler zu Picasso geben und eine benutzerdefinierte Cache-Implementierung darauf setzen. Ich würde empfehlen, OkHttp mit benutzerdefiniertem Caching zu verwenden, das Dateien in dem von Ihnen gewünschten Format speichert. Wenn Sie das tun, müssen Sie eine Funktion haben, die Bild-URLs in einen Dateipfad auf einem Gerät konvertiert.

In jede Seite ändern, wenn Sie eine innerhalb Ihrer ViewPager haben, setzen Sie die ShareActionProvider in Ihre Fragmente.

Erhalten Sie die Referenz der ShareActionProvider innerhalb onCreateOptionsMenu. Und dann setzen Sie den Intent mit dem Dateipfad, den Sie erhalten.

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); 

Edit: Die andere Option, die ich lieber ist ShareActionProvider zu Graben und einen normalen Menüpunkt für diesen. Das Problem mit ShareActionProvider ist, dass Sie die Freigabe Intent bereit für den Benutzer vorher teilen müssen. Sie müssen es fertig machen, auch wenn der Benutzer es nicht teilt.

Aber wenn Sie eine normale Schaltfläche haben, ist es viel einfacher, weil Sie die Operation nur ausführen, wenn der Benutzer auf die Schaltfläche "Teilen" klickt. In diesem Fall können Sie einfach das Bild noch einmal von Picasso mit einem Target Objekt anfordern und schreiben Sie die Bitmap Sie haben eine Datei in dem freigegebenen externen Dateisystem und teilen Sie es.