Android- как я могу преобразовать объект android.net.Uri в объект java.net.URI?

Я пытаюсь получить объект FileInputStream на изображении, которое пользователь выбирает из галереи изображений. Это андроид URI, возвращенный android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI

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

Когда я пытаюсь создать объект java URI из этого объекта, я получаю IllegalArgumentException с описанием исключения Ожидаемая файловая схема в URI: content: // media / external / images / media / 3, тогда как android URI показывает схему как содержание

Обновление: не нашел решения исходного вопроса. Но если вам нужен поток байтов изображения в галерее изображений, этот фрагмент кода сделает это.

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

person lostInTransit    schedule 18.02.2009    source источник


Ответы (5)


Вы можете использовать toString метод android Uri в сочетании с String конструктором 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

person Brian Gianforcaro    schedule 18.02.2009
comment
Спасибо. Пробовал. Выдает исключение (у java.net.URI должна быть действующая схема) - person lostInTransit; 19.02.2009
comment
это неверно и не удастся, если в URI есть символы, требующие кодирования (например, пробел). android.net.Uri.toString () декодирует закодированные символы, а java.net.URI выдаст исключение, если вы попытаетесь построить его на незакодированной строке. правильное решение huri = new java.net.URI(URLEncoder.encode(auri.toString(), "UTF-8")); - person Jeffrey Blattman; 01.03.2013
comment
@Jeffrey: Uri.toString () возвращает закодированные символы на моем устройстве Android 4.1.2 - person Rémy DAVID; 20.03.2013
comment
@ RémyDAVID это не так. я только что попробовал. для a.n.Uri с пробелом пробел не кодируется. попробуй сам: Uri.parse("content://foo.bar.com/0?file=my goodness").toString(). вы правы, что в javadocs указано, что он возвращает закодированную строку, но не говорит, какая кодировка используется. - person Jeffrey Blattman; 20.03.2013

Нашел правильный способ открыть InputStream из URI контента:

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

Это все!

person Fedor    schedule 24.04.2009
comment
Спасибо!!! так просто, я знал, что это где-то там есть. Принятый ответ может работать в некоторых случаях, но не во всех случаях кажется безопасным / функциональным. - person plainjimbo; 19.08.2011
comment
Большое спасибо!!!! Работает как амулет, когда вам нужно получить byte [] из изображения, выбранного во встроенной галерее! - person Alex Bush; 28.02.2012
comment
Эта сила закрывает мое приложение и открывает Binder.class без прикрепленного источника. Я отправляю Contacts.CONTENT_VCF_URI - person tasomaniac; 14.10.2012

Есть решение вашего исходного вопроса (преобразовать Uri в URI):

  1. Получите реальный путь к файлу (посмотрите этот код: Получите имя файла и путь из URI из mediastore)

  2. Получите URI, используя реальный путь и конструктор: URI (String uri)

Если вам нужна дополнительная информация, посмотрите здесь:

Как удалить видео, записанное с помощью Намерение с ACTION_VIDEO_CAPTURE?

person jgilrincon    schedule 30.06.2011

Я проголосовал за ответ jgilrincon. Я не могу комментировать из-за низкой репутации, и вот дополнительная информация - вы можете использовать FileHelper.java из проекта Apache Cordova, в нем есть функции, необходимые для обработки файлов из строк Uri, с учетом хранилища медиастранов (и папки с ресурсами приложения)

В частности, этот метод предоставляет InputStream из Uri:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)
person Mixaz    schedule 19.09.2013

Поскольку построение String не работает, вы пробовали просто построить его самостоятельно?

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

Вы также можете дважды проверить, что вы получаете действительные данные из класса URI Android. Документы, перечисленные в моем другом ответе, обсуждают, как он практически не проверяет ошибки. Если действительно есть ошибка, класс все равно просто выплевывает мусор и не генерирует никаких исключений. Это может быть причиной того, что класс java, который выполняет проверку, выдает исключение.

person Brian Gianforcaro    schedule 19.02.2009
comment
Спасибо, Брайан. URI возвращается самим Android. он содержит путь к изображению в галерее изображений телефона. так что ничего не могу поделать с изображением. Я постараюсь разместить uri в вопросах - person lostInTransit; 21.02.2009
comment
Я думаю, вы имели в виду getScheme и getSchemeSpecificPart, верно? - person Piotr; 27.06.2014