2012-06-07 16 views
10

Meine App ruft die Galerie mit der Absicht, die wie folgt aussieht:Rufen Sie ein nicht im Cache gespeichertes Picasa-Bild aus der Galerie ab. 3.0 und 4.0

Intent intent = new Intent(Intent.ACTION_PICK, 
     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(intent, SELECT_IMAGE_FROM_GALLERY); 

In Versionen < 3.0 gibt es kein Problem.

Mit 3.0 und höher Versionen, wenn Sie ein lokales Bild zu erhalten, die Absicht in der onActivityResult Methode enthält ein Uri wie ...

content://media/external/images/media/XXX 

aber, wenn Sie ein picasa Bild wählen ist die uri etwas ähnliches. ..

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

Ich lese viele über dieses Problem und ich versuchte viele Umgehungslösungen.

Im Moment kann ich Bilder mit nur gecached obtain:

getContentprovider().openInputStream(uri) 

Das Problem ist, dass, wenn das Bild im Cache ist nicht, die openInputStream (uri) Methode, ein FileNotFoundException wirft, und ich kann nicht das Bild erhalten: _ (

Wer weiß, wie die Datei oder die uRL zu erhalten, um die Datei oder etwas herunterladen, um das Bild zu bekommen ??

T hanks !!

+0

endete schließlich mit einer klassischen Lösung ... Durch die Verwendung von Document.util, die alle Autorität umfasst: - http://stackoverflow.com/a/30453641/1384010 –

Antwort

2

Eine weitere Möglichkeit, den Bitstrom für das Bild zu bekommen, ist durch die picasa api ....

eine Zuordnung zu Content-Provider-uri Anwendung ...

Inhalt: //com.google.android. gallery3d.provider/picasa/item/5703943700733980450

man kann es zu einer picasa api Karte wie folgt aus:

item => photoid Name ?? Albumid ??

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

Oben ist eine api Anfrage für Fotoeintrag - picasa Dokumentation für weitere Informationen.

API erfordert

Namen ALBUMID PhotoID

Name, den ich denke, u von dem Konto auf dem Telefon zu bekommen. AlbumID ist schwierig, da der/item/node-Wert im Content-Provider keine GUID ist, die eine Beziehung verwenden kann, um das Album zu folgern. Ich denke nicht .. AFAIK in Picasa, Sie benötigen den Benutzer, Album,

"media $ group": { "media $ content": [ { "url" Foto Tupel einen Verweis auf ein Foto Eintrag und der Foto-Eintrag hat die URL für das große Bild in dem API-Elemente zu erhalten :

Sie können den Textwert des URL-Attributs nehmen und es mit http (s) anfordern, wenn die Sichtbarkeit des Albums öffentlich ist.Die Antwort ist der binäre Stream des JPG.

php picasa api show large image

siehe akzeptierte Antwort auf den obigen Link, um weitere Informationen zu bekommen, das Bild, das Sie von der picasa api wollen.

Mit einem meiner eigenen Inhalte URI in einem Beispiel ...

Inhalt: //com.google.android.gallery3d.provider/picasa/item/5703943700733980450

ist nicht im Cache vorhanden, so Wie bekomme ich das Bild?

auch der Name auf dem Konto ist 'rowntreerob' und ich weiß, dass photoid 5703943700733980450 5703943611411433905.

Also mache ich für den Eintrag eine api Anfrage ALBUMID gehört

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

und überprüfen Sie die Antwort für den Textwert

"media $ group": { "media $ content": [{ "url":

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

Ich mache ein Foto Bild Anfrage den Wert oben, und ich habe das Bild mit.


Die Galerie 3D-App hat auch den Code, den Sie können, weil die Gabel wo auch immer sie auf einen der Liste der Thumbnails, delegiert an die Contentprovider-Schnittstelle, um eine ‚touch‘ erkennt das BMP ‚get‘. Ich glaube, dass diese Schnittstelle alle oben erwähnten blutigen Implementierungs-Nissen kapselt. Durch die Aufforderung an den ContentProvider, den BMP zu produzieren, muss sich der Entwickler nicht um den Geschmack der Implementierung kümmern? Auf dem Daumentouch kann Gallery3d den Provider einfach auffordern, den BMP und seine Providerinstanz zurückzugeben, die für die Auflösung der verschiedenen Zustände des Caches zuständig ist und ob Netzwerkanrufe erforderlich sind, um den BMP zurückzugeben.

+0

yeah ... bc es unsere Aufgabe sein sollte, Entwickler, all das zu tun lol. Ich denke nicht . das ist googles fuck up, nicht devs – ChuckKelly

7

Die richtige Lösung ist ACTION_GET_CONTENT zu verwenden. Ihr Name klingt möglicherweise nicht so intuitiv wie ACTION_PICK, aber es ist der, den Sie für das verwenden sollten, was Sie versuchen zu tun.

Der Grund hinter der Verwendung ACTION_GET_CONTENT für ein Bild in Ihrer Galerie Kommissionierung statt ACTION_PICK der Verwendung und deutete auf den URI-Providers Images ist, dass ACTION_GET_CONTENT ist gut unterstützt, während ACTION_PICK ist nicht. Es war mentioned ein paar Mal von Android Framework-Ingenieuren.

Ich lernte es auf die harte Tour. Bevor ich das herausfand, musste ich mich mit verschiedenen Unstimmigkeiten auseinandersetzen.


Ein Hinweis auf diese Sie

Zusammenhang immer openInputStream verwenden sollten, um die Datei durch eine ContentResolver mit dem URI erhalten anstatt zu versuchen, den wahren Weg zu erhalten, in dem zu erhalten, die Datei gespeichert wird. Es kann durchaus sein, dass die ContentProvider Implementierung von einem Cloud-Service unterstützt wird (dies ist bei Picasa der Fall) oder die Implementierungsdetails ändern sich im Laufe der Zeit.

Mit den Inhaltsanbietern von Android können Sie abstrahieren, wie auf die Daten zugegriffen wird. Der Versuch, herauszufinden, wo sich die Datei befindet, ist ein häufiger Fehler, den ich sehe. Normalerweise wird vorgeschlagen, den Standort zu finden, indem die DATA Spalte des angegebenen URI abgefragt wird. Abhängig von der verwendeten ContentProvider kann es verschiedene Dinge zurückgeben und sogar im Laufe der Zeit mit neuen Versionen ändern.

Durch die Verwendung von openInputStream müssen Sie nicht kümmern, wo die Datei ist, Sie erhalten nur den Strom von Bytes und tun, was Sie damit wünschen. Auf diese Weise haben Sie keine Probleme, Inhaltsanbieter von anderen Apps wie Google Drive, Dropbox usw. zu unterstützen, die eine ähnliche Auswahlhilfe für die Auswahl eines Bildes bieten.

Ich weiß, dass OP openInputStream verwendet, aber andere Antworten schlagen anders vor und es ist etwas, das ich zu häufig sehe.