Подтвердить что ты не робот

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

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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

Что все!

Ответ 3

Существует решение вашего исходного вопроса (конвертировать Uri в URI):

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

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

Ответ 4

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

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

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)

Ответ 5

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