Определите, действителен ли URI, и сделайте его действительным файлом на Android для изображений

В настоящее время я пытаюсь преобразовать все возможные допустимые URI в действительный файл, который затем могу передать в Multipart.File и загрузить на сервер.

У меня есть код, который я пишу и с которым работаю, но в некоторых случаях он дает сбой. Кроме того, ознакомьтесь с моей сутью здесь: https://gist.github.com/mmdock/ed04315851534029f5bc6ea77d6dc6e4

Ограничения, с которыми я работаю, следующие:

  1. Он должен работать со сборками до KitKat.
  2. Он должен обрабатывать настоящие файлы (мы загружаем файлы из FB или IG)
  3. Он должен обрабатывать документ URI
  4. Он должен обрабатывать удаленный URI документа (галерея Google решает автономно ли загружать файлы и держать только превью)
  5. В конце он должен предоставить «реальный» путь, то есть путь файл в папке приложений
  6. Он должен поддерживать полномочия первого, второго и третьего Google Photo. URI генерации галереи и Picasa (устарело Google, все еще используется на некоторых других провайдерах)
  7. Он должен поддерживать контент-провайдеров (https://developer.android.com/guide/topics/providers/content-providers)

Некоторые ссылки, которые я использовал для написания своего кода в его нынешнем виде: https://www.dev2qa.com/how-to-get-real-file-path-from-android-uri/

https://github.com/codepath/android_guides/wiki/Доступ к камере и сохраненным носителям

Ищу исправления в моем коде или, надеюсь, в сторонней библиотеке, в которой нет тех же проблем, что и в моем коде. Я пробовал ряд сторонних библиотек (и использовал их в качестве ссылок для своего кода), например:

https://github.com/coltoscosmin/FileUtils/blob/master/FileUtils.java

https://github.com/alhazmy13/MediaPicker/blob/master/libary/src/main/java/net/alhazmy13/mediapicker/FileProcessing.java

https://gist.github.com/alexzaitsev/75c9b36dfcffd545c676

https://github.com/kunpark168/EP/blob/c8cd20504a6696fc35f3e64b4bc79bbadbba76b4/eyeprotec/app/src/main/java/com/uas/eyeprotec/utils/DocumentUtil.java

https://gist.github.com/tatocaster/32aad15f6e0c50311626

https://github.com/opendatakit/collect/blob/master/collect_app/src/main/java/org/odk/collect/android/utilities/MediaUtils.java

https://github.com/Khang-NT/Android-Media-Converter/blob/16f347f7b883f854c400ba7e5ce31db4fdac2740/app/src/main/java/com/github/khangnt/mcp/util/UriUtils.java

https://github.com/esafirm/android-image-picker/blob/master/imagepicker/src/main/java/com/esafirm/imagepicker/features/ImageFileLoader.java

https://github.com/jkwiecien/EasyImage/blob/master/library/src/main/java/pl/aprilapps/easyphotopicker/EasyImage.java

Извините за большое количество ссылок. Некоторое время работал над исправлением этого.

Единственный более-менее валидный код — copyContentToTempFile().

CommonsWare 22.01.2019 22:15

@CommonsWare, что ты имеешь в виду?

daredevil1234 23.01.2019 00:18

Uri не является файлом. Если вам нужен файл, сделайте то, что вы делаете в copyContentToTempFile(), и скопируйте содержимое в файл, которым вы управляете. Все остальное, что вы делаете, основано на множестве предположений, которые могут быть неверными в зависимости от версии ОС, изменений прошивки устройства и т. д.

CommonsWare 23.01.2019 00:40

@CommonsWare да, это то, что делает буквально каждая библиотека, если вы более или менее просматриваете ссылки. Преобразование из URI в полезный файл, по-видимому, невероятно сложная задача для Android.

daredevil1234 23.01.2019 00:58

Не совсем. У вас есть код для этого в copyContentToTempFile().

CommonsWare 23.01.2019 01:01

@CommonsWare во многих случаях не работает, поэтому я работаю над этим.

daredevil1234 23.01.2019 19:21

«это не работает во многих случаях» - открытие InputStream и копирование байтов в файл должно работать во всех случаях, если вы делаете это, пока у вас есть права доступа к содержимому. Вы можете задать отдельный вопрос о переполнении стека, показывающий код copyContentToTempFile() и объясняющий в деталях, что означает «это не работает во многих случаях».

CommonsWare 23.01.2019 20:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
57
0

Другие вопросы по теме