2012-06-07 15 views
10

Mi aplicación está llamando a la galería con una intención que tiene este aspecto:Recuperar una imagen de Picasa no almacenada en caché de la Galería. 3.0 y 4.0

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

En las versiones 3.0 < no hay ningún problema.

Con 3.0 y versiones superiores, cuando se obtiene una imagen local, la intención en el método onActivityResult contiene un Uri como ...

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

pero cuando se selecciona una imagen de Picasa el URI es algo así. ..

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

He leído muchos sobre ese problema y he intentado muchas soluciones.

Por el momento, puedo obtener imágenes justo en caché usando:

getContentprovider().openInputStream(uri) 

El problema es que, cuando la imagen no se almacena en caché, el openInputStream (URI) método, lanza una FileNotFoundException, y no puedo obtener la imagen: _ (

Cualquier persona sabe cómo obtener el archivo o la dirección URL para descargar el archivo o algo para obtener la imagen ??

T madejas !!

+0

finalmente terminó con una solución clásica ... Mediante el uso de Document.util, que cubre toda autoridad: - http://stackoverflow.com/a/30453641/1384010 –

Respuesta

2

Otra forma de obtener el flujo de bits para la imagen es a través de la API de Picasa ....

la aplicación de algunos de asignación al contenido uri proveedor ...

contenido: //com.google.android. gallery3d.provider/picasa/artículo/5703943700733980450

se puede asignar a una API de Picasa como el siguiente:

item => photoid nombre ?? albumid ??

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

anterior es una solicitud de API para la entrada de foto - ver documentos de Picasa para obtener más información.

API requiere

Nombre ALBUMID photoid

Nombre creo que u puede obtener de la cuenta en el teléfono. AlbumID es complicado porque el valor de/item/node en el proveedor de contenido no es un GUID que pueda usar una relación para inferir el álbum en el que está. No creo ... AFAIK en picasa, necesitas el usuario, álbum, foto tupla para obtener una referencia a una entrada de foto y la entrada de fotos tiene la dirección URL de la foto grande en el elemento de API:

"medios $ grupo": { "medios de $ content": [ { "url" :

Puede tomar el valor text del atributo url y solicitarlo mediante http (s) si la visibilidad del álbum es pública.La respuesta es la secuencia binaria del JPG.

php picasa api show large image

ver la respuesta aceptada en el enlace anterior para más detalles sobre cómo obtener la imagen que desea de la API de Picasa.

Utilizando uno de mi propio contenido del URI en un ejemplo ...

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

no está disponible en la caché por lo cómo obtener la imagen?

así el nombre de la cuenta es 'rowntreerob' y sé que photoid 5703943700733980450 pertenece a ALBUMID 5703943611411433905.

Por lo tanto, hago una solicitud de API para la entrada

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

y compruebe la respuesta para el valor de texto de

"medios $ grupo": { "medios de $ content": [{ "url":

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

Puedo hacer una solicitud de imagen foto usando el valor anterior y tengo la imagen.


La Galería 3D aplicación también tiene el código que podría desembolsar porque dondequiera que se detecta un 'toque' en uno de la lista de miniaturas, delega a la interfaz ContentProvider a 'conseguir' la BMP. Creo que esta interfaz encapsula todas las sangrientas nits de implementación mencionadas anteriormente. Al pedir al ContentProvider que produzca el BMP, ¿el desarrollador no tiene que preocuparse por el sabor de la implementación? En thumbtouch, Gallery3d puede simplemente pedirle al proveedor que devuelva el BMP y es la instancia del proveedor que es responsable de resolver los diversos estados del caché y si se requerirán llamadas de red para devolver el BMP.

+0

sí ... bc que debería ser nuestro trabajo como desarrolladores para hacer todo eso jajaja. Yo creo que no . esto es Google Fck Up, no desarrolladores – ChuckKelly

7

La solución correcta es usar ACTION_GET_CONTENT. Es posible que su nombre no suene tan intuitivo como ACTION_PICK, pero es el que debe usar para lo que intenta hacer.

La razón detrás del uso de ACTION_GET_CONTENT para recoger una imagen en su galería en lugar de utilizar ACTION_PICK y apuntando al proveedor de URI de la Imagestore es que se ACTION_GET_CONTENTbien soportado, mientras que ACTION_PICK es no. Ha sido mentioned un par de veces por los ingenieros de Android Framework.

Lo aprendí de la manera difícil. Antes de enterarme de esto tuve que lidiar con varias inconsistencias.


una nota relacionada a este

Siempre debe utilizar openInputStream para obtener el archivo a través de un ContentResolver con el URI recibida en lugar de tratar de obtener la ruta real en el que se almacena el archivo. Puede ser que la implementación ContentProvider esté respaldada por un servicio en la nube (este es el caso de Picasa) o los detalles de la implementación cambian con el tiempo.

Los proveedores de contenido de Android le permiten abstraer cómo se está accediendo a los datos. Tratar de averiguar dónde se encuentra el archivo es un error común que veo. Por lo general, lo que se sugiere es encontrar la ubicación consultando la columna DATA del URI dado. Dependiendo del ContentProvider usado, puede devolver cosas diferentes e incluso cambiar con el tiempo con nuevas versiones.

Al usar openInputStream no tiene que importar dónde está el archivo, solo recibe el flujo de bytes y hace lo que desee con él. De esta forma, no tendrás problemas para dar soporte a los proveedores de contenido de otras aplicaciones como Google Drive, Dropbox, etc. que ofrecen una interfaz de selector similar para seleccionar una imagen.

Sé que OP está usando openInputStream, pero otras respuestas sugieren lo contrario y es algo que veo con demasiada frecuencia.

Cuestiones relacionadas