2012-06-07 12 views
10

mia app sta chiamando la galleria con un intento che assomiglia a questo:Recupera un'immagine Picasa non memorizzata nella cache dalla Galleria. 3.0 e 4.0

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

Nelle versioni < 3.0 non c'è nessun problema.

con 3,0 e maggiori versioni, quando si ottiene un'immagine locale, l'intento nel metodo onActivityResult contiene un Uri come ...

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

ma quando si seleziona un'immagine Picasa l'URI è qualcosa di simile. ..

Ho letto molti su questo problema e ho provato molti soluzioni alternative.

Al momento, posso ottenere immagini solo nella cache utilizzando:

getContentprovider().openInputStream(uri) 

Il problema è che, quando l'immagine non viene memorizzata nella cache, il openInputStream (URI) Metodo, lancia una FileNotFoundException, e non posso ottenere l'immagine: _ (

Chiunque sa come ottenere il file o l'URL per scaricare il file o qualcosa per ottenere l'immagine ??

T matasse !!

+0

si è conclusa definitivamente con una soluzione classica ... Utilizzando Document.util, che copre tutta l'autorità: - http://stackoverflow.com/a/30453641/1384010 –

risposta

2

Un altro modo per ottenere il flusso di bit per l'immagine è attraverso l'API picasa ....

applicando un po 'di mappatura per content provider uri ...

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

si può mappare a un api Picasa come il seguente:

item => PHOTOID nome ?? albumid ??

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

Sopra è una richiesta API per l'ingresso foto - vedi documentazione Picasa per i dettagli.

API richiede

Nome ALBUMID PhotoID

Nome penso che u può ottenere dal conto al telefono. AlbumID è complicato perché il valore/item/node nel content provider non è un GUID che può utilizzare una relazione per dedurre l'album in cui è contenuto. Non credo .. AFAIK in picasa, è necessario l'utente, l'album, foto tuple per ottenere un riferimento a una voce di foto e la voce di foto ha l'URL per la foto grande nell'elemento API:

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

È possibile prendere il valore di testo dell'attributo url e richiederlo tramite http (s) se la visibilità dell'album è pubblica.La risposta è il flusso binario del JPG.

php picasa api show large image

vedere la risposta accettata nel link qui sopra per maggiori dettagli su come ottenere l'immagine che si desidera dal api Picasa.

Utilizzando uno dei miei contenuti URI in un esempio ...

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

non è disponibile nella cache in modo come ottenere l'immagine?

bene il nome del conto è 'rowntreerob' e so che PHOTOID 5703943700733980450 appartiene alla ALBUMID 5703943611411433905.

Quindi, io faccio una richiesta API per la voce

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

e controllare la risposta per il valore di testo di

"media $ gruppo": { "media $ content": [{ "URL":

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

faccio una richiesta di immagine foto utilizzando il valore di cui sopra e ho l'immagine.


La Galleria 3D applicazione ha anche il codice si potrebbe sborsare perché dovunque si rileva un 'tocco' su un dell'elenco delle miniature, delega all'interfaccia ContentProvider per 'ottenere' il BMP. Credo che questa interfaccia incapsuli tutte le lentità di gory di cui sopra. Chiedendo al ContentProvider di produrre il BMP, lo sviluppatore non deve preoccuparsi del sapore dell'implementazione ?? Sul thumbtouch, Gallery3d potrebbe semplicemente chiedere al provider di restituire il BMP e l'istanza del provider responsabile della risoluzione dei vari stati della cache e se le richieste di rete saranno necessarie per restituire il BMP.

+0

sì ... bc che dovrebbe essere il nostro lavoro come gli sviluppatori di fare tutto ciò che lol. Penso di no . questo è googles fck up, non dev – ChuckKelly

7

La soluzione corretta è utilizzare ACTION_GET_CONTENT. Il suo nome potrebbe non sembrare intuitivo come ACTION_PICK ma è quello che dovresti usare per quello che stai cercando di fare.

La ragione che sta dietro all'uso ACTION_GET_CONTENT per la raccolta di un'immagine nella tua galleria invece di usare ACTION_PICK e indicando fornitore URI del Imagestore è che ACTION_GET_CONTENT è ben supportato, mentre ACTION_PICK non è . È stato mentioned un paio di volte dagli ingegneri di Android Framework.

L'ho imparato nel modo più difficile. Prima di scoprirlo, ho dovuto affrontare varie incongruenze.


Una nota relativa a questo

È consigliabile utilizzare sempre openInputStream per ottenere il file attraverso un ContentResolver con la URI ricevuto invece di cercare di ottenere il percorso vero e proprio in cui viene memorizzato il file. È possibile che l'implementazione di ContentProvider sia supportata da un servizio cloud (è il caso di Picasa) o che i dettagli di implementazione cambiano nel tempo.

fornitori di contenuti di Android consentono di astratto come i dati si accede. Cercando di scoprire dove si trova il file è un errore comune che vedo. Di solito ciò che viene suggerito è quello di trovare la posizione interrogando la colonna DATA della data URI. A seconda dello ContentProvider utilizzato può restituire cose diverse e persino cambiare nel tempo con nuove versioni.

Utilizzando openInputStream non è necessario preoccuparsi di dove si trova il file, è sufficiente ricevere il flusso di byte e fare ciò che desideri con esso. In questo modo non avrai problemi a supportare i fornitori di contenuti da altre app come Google Drive, Dropbox, ecc. Che forniscono un'interfaccia di selezione simile per selezionare un'immagine.

so OP sta usando openInputStream, ma altre risposte stanno suggerendo altrimenti ed è qualcosa che vedo troppo spesso.

Problemi correlati