Android- how can I convert android.net.Uri object to java.net.URI object?

AndroidUriAndroid BitmapFileinputstream

Android Problem Overview


I am trying to get a FileInputStream object on an image that the user selects from the picture gallery. This is the android URI returned by android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI

content://media/external/images/media/3

When I try to construct a java URI object from this object, I get an IllegalArgumentException with the exception description Expected file scheme in URI: content://media/external/images/media/3 whereas the android URI shows the scheme as content

Update: Never found a solution for the original question. But if you want the byte stream of an image in the pictures gallery, this piece of code will do that.

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

Android Solutions


Solution 1 - Android

You could use the toString method of the android Uri in combination of the String based constructor of the Java URI.

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

Android URI | Java URI

Solution 2 - Android

Found the correct way to open InputStream from content URI:

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

That's all!

Solution 3 - Android

There is a solution to your original question (convert Uri to URI):

  1. Get the real file path (look this code: https://stackoverflow.com/questions/3401579/android-get-filename-and-path-from-uri-from-mediastore)

  2. Get the URI using the real path and the constructor: URI(String uri)

If you need more details, look here:

https://stackoverflow.com/questions/6513483/how-deleting-a-video-recorded-using-an-intent-with-action-video-capture

Solution 4 - Android

I voted for jgilrincon's answer. I can't comment due to low reputation, and here goes some additional info - you can use FileHelper.java from Apache Cordova project, it has functions that you need for file handling from Uri strings, considering mediastore as well (and app assets folder)

Particularly this method provides InputStream from Uri:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)

Solution 5 - Android

Since the String constructing doesn't work have you tried just constructing it your self?

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

You might also want to double check that your getting valid data out of Android URI class. The docs as listed in my other answer discuss how it does pretty much no error checking. If there is infact an error the class just spits out garbage anyway and doesn't throw any exceptions. Which could very likely be why the java class which does do validation is throwing an exception.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionlostInTransitView Question on Stackoverflow
Solution 1 - AndroidBrian GianforcaroView Answer on Stackoverflow
Solution 2 - AndroidFedorView Answer on Stackoverflow
Solution 3 - AndroidjgilrinconView Answer on Stackoverflow
Solution 4 - AndroidMixazView Answer on Stackoverflow
Solution 5 - AndroidBrian GianforcaroView Answer on Stackoverflow