Obtener la ruta absoluta del archivo a partir del URI de contenido para las imágenes buscadas

Resuelto Priya Mall asked hace 54 años • 2 respuestas

Estoy intentando compartir imágenes de otras aplicaciones en mi aplicación utilizando la intención implícita ACTION_SEND .

Al compartir imágenes de búsqueda desde el navegador Chrome, la aplicación recibe una intención con un URI de contenido como este: content://com.android.chrome.FileProvider/images/screenshot/1457448067808912906311.jpg

¿Cómo puedo obtener la ruta del archivo de este tipo de URI de contenido? Todas las demás aplicaciones como Facebook y Google+ lo están haciendo. Estoy usando FileChooser para obtener la ruta del archivo de otros tipos de URI de contenido (por ejemplo, de la Galería).

Intenté buscar por todas partes, sin mucha ayuda. ¿Alguien puede sugerir cómo trabajar con estos URI de contenido?

Priya Mall avatar Jan 01 '70 08:01 Priya Mall
Aceptado

Si es absolutamente necesario una copia local del archivo, necesitará abrir la InputStreamcopia del contenido en un archivo local al que conozca la ruta y luego continuar desde allí. Nota al margen: La guayaba ByteStreams#copyes una manera fácil de lograr esto.

Por supuesto, este archivo ya no está respaldado por la fuente Uri original, por lo que no creo que esto sea lo que desea. En su lugar, deberías trabajar con la API prevista para Uri. Eche un vistazo al marco de acceso al almacenamiento

Editar

Así es como puede obtener una InputStreamde suUri

InputStream inputStream = getContentResolver().openInputStream(uri);
Scott Tomaszewski avatar Mar 08 '2016 15:03 Scott Tomaszewski

¿Cómo puedo obtener la ruta del archivo de este tipo de URI de contenido?

No es necesario, ya que no es necesario que haya ningún archivo detrás del archivo Uri, y mucho menos uno al que pueda acceder. Eso Uripodría indicar:

  • Un archivo local en almacenamiento externo
  • Un archivo local en el almacenamiento interno de la otra aplicación
  • Un archivo local en almacenamiento extraíble
  • Un archivo local que está cifrado y debe descifrarse sobre la marcha
  • Un flujo de bytes contenidos en una BLOBcolumna en una base de datos.
  • Un fragmento de contenido que la otra aplicación debe descargar primero
  • ...etcétera

Todas las demás aplicaciones como Facebook y Google+ lo están haciendo.

No, ellos no son. Están usando ContentResolvery:

  • openInputStream()para leer los bytes asociados con el contenido
  • getType()para obtener el tipo MIME asociado con el contenido
  • query()y OpenableColumnspara obtener el tamaño y el nombre para mostrar asociados con el contenido
CommonsWare avatar Mar 08 '2016 15:03 CommonsWare