Android- ¿cómo puedo convertir el objeto android.net.Uri al objeto java.net.URI?

Estoy tratando de obtener un objeto FileInputStream en una imagen que el usuario selecciona de la galería de imágenes. Este es el URI Android devuelto por android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI

contenido: // media / external / images / media / 3

Cuando trato de construir un objeto URI de Java desde este objeto, obtengo una IllegalArgumentException con la descripción de excepción. Esquema de archivo esperado en URI: content: // media / external / images / media / 3 mientras que el URI de Android muestra el esquema como contenido

Nunca encontré una solución para la pregunta original. Pero si quieres la transmisión de bytes de una imagen en la galería de imágenes, este fragmento de código hará eso.

 Bitmap bitmap = Media.getBitmap(getContentResolver(), imageUri); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); ByteArrayInputStream fileInputStream = new ByteArrayInputStream(bytes.toByteArray()); 

Puede utilizar el método toString del URI de Android en combinación del constructor basado en String del URI Java.

 android.net.Uri auri = new android.net.Uri(what ever); java.net.URI juri = new java.net.URI(auri.toString()); 

URI de Android | URI de Java

Se encontró la forma correcta de abrir InputStream desde el URI de contenido:

 InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri); 

¡Eso es todo!

Hay una solución a su pregunta original (convertir URI a URI):

  1. Obtenga la ruta real del archivo (vea este código: Obtenga el nombre de archivo y la ruta del URI de mediastore )

  2. Obtenga el URI usando la ruta real y el constructor: URI (String uri)

Si necesita más detalles, mire aquí:

¿Cómo eliminar un video grabado usando un Intento con ACTION_VIDEO_CAPTURE?

Voté por la respuesta de jgilrincon. No puedo hacer ningún comentario debido a la baja reputación, y aquí va algo de información adicional: puede usar FileHelper.java del proyecto Apache Cordova, tiene funciones que necesita para el manejo de archivos de cadenas Uri, considerando también el mediastore (y la carpeta de activos de la aplicación) )

Particularmente, este método proporciona InputStream desde Uri:

 public static InputStream getInputStreamFromUriString(String uriString, Activity cordova) 

Como la construcción de String no funciona, ¿has intentado construirlo tú mismo?

 android.net.URI auri = new android.net.URI(what ever); java.net.URI juri = new java.net.URI(auri.getSchema(), auri.getSchemaSpecificPart(), auri.getFragment()); 

También es posible que desee comprobar que está obteniendo datos válidos de la clase de URI de Android. Los documentos que figuran en mi otra respuesta discuten cómo prácticamente no verifica errores. Si de hecho hay un error, la clase simplemente arroja basura de todos modos y no arroja ninguna excepción. Que muy probablemente sea por qué la clase java que hace la validación está lanzando una excepción.