Recuperar una imagen de Picasa no almacenada en caché de la Galería. 3.0 y 4.0

Mi aplicación está llamando a la galería con una intención que se parece a esto:

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

En versiones <3.0 no hay ningún problema.

Con las versiones 3.0 y 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í como …

 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 en caché usando:

 getContentprovider().openInputStream(uri) 

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

Alguien sabe cómo obtener el archivo o la URL para descargar el archivo o algo para obtener la imagen ??

¡¡Gracias!!

La solución correcta es utilizar ACTION_GET_CONTENT . Su nombre puede no sonar tan intuitivo como ACTION_PICK pero es el que debe usar para lo que está tratando de hacer.

La razón detrás de usar ACTION_GET_CONTENT para escoger una imagen en su galería en lugar de usar ACTION_PICK y apuntar al proveedor de URI de ImageStore es que ACTION_GET_CONTENT está bien soportado , mientras que ACTION_PICK no lo es. Ha sido mencionado un par de veces por los ingenieros de Android Framework.

Lo aprendí de la manera más difícil. Antes de averiguar sobre esto tuve que lidiar con varias inconsistencias.


Una nota relacionada con este

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

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

Mediante el uso de openInputStream no tiene que preocuparse por el lugar donde se encuentra el archivo, acaba de recibir el flujo de bytes y hacer lo que desea con él. De esta forma, no tendrás problemas para admitir proveedores de contenido de otras aplicaciones como Google Drive, Dropbox, etc. que proporcionen una interfaz de selector similar para seleccionar una imagen.

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

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

Aplicando algunos mapeos al proveedor de contenido uri …

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

Uno puede asignarla a una api de picasa como la siguiente:

Item => photoid nombre ?? Albumid?

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

Arriba hay una solicitud de api para entrada de fotos – vea docs de picasa para más detalles.

La API requiere

Nombre albumID photoID

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

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

Puede tomar el valor de texto del atributo url y solicitarlo utilizando http (s) si la visibilidad del álbum es pública. La respuesta es el flujo binario del JPG.

Php picasa api mostrar imagen grande

Vea la respuesta aceptada en el enlace anterior para obtener más detalles sobre cómo obtener la imagen que desea de la píxeles api.

Utilizando uno de mis URI de contenido en un ejemplo …

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

¿No está disponible en caché así que cómo conseguir la imagen?

Así el nombre en 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

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

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

Hago una solicitud de la imagen de la foto usando el valor arriba y tengo la imagen.


La aplicación Galería 3D también tiene el código que podría fork porque dondequiera que detecta un 'toque' en una de la lista de miniaturas, delega a la interfaz contentProvider para 'obtener' el BMP. Creo que esta interfaz encapsula todos los nits de implementación sangrientos mencionados anteriormente. Preguntando al ContentProvider para producir el BMP, el desarrollador no tiene que preocuparse por el sabor de la implementación ?? En el thumbtouch, Gallery3d puede simplemente pedirle al proveedor que devuelva el BMP y su instancia de proveedor responsable de resolver los diversos estados del caché y si se requieren llamadas de red para devolver el BMP.

  • OnCloseListener de SearchView no funciona
  • Cómo evitar que mi aplicación aparezca en la lista de aplicaciones utilizadas recientemente
  • Flujo de problemas de audio en ICS
  • NFC no puede enviar datos de Android 4.0.3
  • Mostrar pantalla de vista previa negra en el Administrador de tareas de ICS
  • Cómo configurar el volumen de llamada entrante mediante programación en android?
  • ¿Funciona la gran pila de Android para teléfonos antiguos actualizados a ICS?
  • El helado de helado de elipse añade [
  • Visualización de elementos de menú en la barra de acciones de Android ICS
  • Android - Navegación con pestañas en orientación horizontal
  • Videos que no se reproducen en modo de pantalla completa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.