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.
- ¿Cómo obtener el tema de diálogo de alerta de sándwich de helado android?
- ¿No hay botones de software para el emulador de ICS?
- Cómo grabar el video usando la vista previa de la cámara en TextureView
- Desinstalar la aplicación silenciosamente con priveleges del sistema
- Ocultar / cambiar la imagen de la pantalla de aplicación de las aplicaciones recientes Android 4.x
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!!
- TYPE_SYSTEM_OVERLAY en ICS
- Android ICS con problemas de compatibilidad con JQuery Mobile1.0
- Artículos de la barra de herramientas de Android como tres puntos
- El widget de la pantalla de inicio de ICS aparece en el dispositivo Pre-ics
- Ocultar los botones del conmutador de tareas de inicio de ICS
- File.list () devuelve los archivos en un orden diferente para 4.0 que 2.2
- ADB no reconoce mi Galaxy Nexus - Win7
- ¿Por qué no puedo obligar a una de mis Vistas a renderizarla en el software?
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.
- Intentando actualizar ADT – recibiendo error de "dependencia en conflicto"
- Java.exe terminó con valor de salida no nulo 2 en Android Studio