2009-02-18 4 views
44

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

содержания: // СМИ/внешние/изображения/СМИ/3

Когда я пытаюсь построить Java URI объекта из этого объекта, я получаю IllegalArgumentException с описанием исключения Ожидаемая схема файла в URI: содержание: // СМИ/внешние/изображения/СМИ/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()); 

ответ

40

Вы можете использовать toString метод андроида Uri в комбинации на основе конструктору Java URIString.

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

Android URI | Java URI

+3

Спасибо. Пробовал это. Он дает исключение (java.net.URI должен иметь действительную схему) – lostInTransit

+8

это неверно и не удастся, если URI имеет символы, которым требуется кодировка (например, пробел). android.net.Uri.toString() декодирует закодированные символы, а java.net.URI будет генерировать исключение, если вы попытаетесь построить его на некодированной строке. правильное решение 'huri = new java.net.URI (URLEncoder.encode (auri.toString()," UTF-8 "));' –

+0

@Jeffrey: Uri.toString() возвращает закодированные символы на моем Android 4.1.2 устройство –

0

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

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. Документы, перечисленные в моем другом ответе, обсуждают, как он почти не проверяет ошибки. Если есть infact ошибка, класс просто выплескивает мусор в любом случае и не бросает никаких исключений. Вероятно, это может быть причиной того, что класс java, который делает проверку, бросает исключение.

+0

Спасибо Брайан. Ури возвращается самим андроидом. он содержит путь изображения в картинной галерее телефона. поэтому ничего не может сделать с изображением. Я попытаюсь опубликовать uri в вопросах – lostInTransit

+0

Я думаю, вы имели в виду getScheme и getSchemeSpecificPart, не так ли? – Piotr

38

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

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

Это все!

+2

Спасибо !!! так просто, я знал, что он где-то там. В некоторых случаях принятый ответ может работать, но во всех случаях он не выглядит безопасным/функциональным. – plainjimbo

+0

Спасибо большое !!!! Работает как прелесть, когда вам нужно получить байт [] из изображения, выбранного в встроенной галерее! –

+0

Эта сила закрывает мое приложение и открывает Binder.class без источника. Я отправляю Contacts.CONTENT_VCF_URI – tasomaniac

2

Существует решение для вашего первоначального вопроса (конвертировать Ури в URI):

  1. Получить путь реального файла (смотрите этот код: Get filename and path from URI from mediastore)

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

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

How to delete a video recorded using an Intent with ACTION_VIDEO_CAPTURE?

1

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

в частности, этот метод обеспечивает InputStream от Uri:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova) 
Смежные вопросы