В настоящее время я пытаюсь преобразовать все возможные допустимые URI в действительный файл, который затем могу передать в Multipart.File и загрузить на сервер.
У меня есть код, который я пишу и с которым работаю, но в некоторых случаях он дает сбой. Кроме того, ознакомьтесь с моей сутью здесь: https://gist.github.com/mmdock/ed04315851534029f5bc6ea77d6dc6e4
Ограничения, с которыми я работаю, следующие:
Некоторые ссылки, которые я использовал для написания своего кода в его нынешнем виде: 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://gist.github.com/alexzaitsev/75c9b36dfcffd545c676
https://gist.github.com/tatocaster/32aad15f6e0c50311626
Извините за большое количество ссылок. Некоторое время работал над исправлением этого.
@CommonsWare, что ты имеешь в виду?
Uri не является файлом. Если вам нужен файл, сделайте то, что вы делаете в copyContentToTempFile(), и скопируйте содержимое в файл, которым вы управляете. Все остальное, что вы делаете, основано на множестве предположений, которые могут быть неверными в зависимости от версии ОС, изменений прошивки устройства и т. д.
@CommonsWare да, это то, что делает буквально каждая библиотека, если вы более или менее просматриваете ссылки. Преобразование из URI в полезный файл, по-видимому, невероятно сложная задача для Android.
Не совсем. У вас есть код для этого в copyContentToTempFile().
@CommonsWare во многих случаях не работает, поэтому я работаю над этим.
«это не работает во многих случаях» - открытие InputStream и копирование байтов в файл должно работать во всех случаях, если вы делаете это, пока у вас есть права доступа к содержимому. Вы можете задать отдельный вопрос о переполнении стека, показывающий код copyContentToTempFile() и объясняющий в деталях, что означает «это не работает во многих случаях».




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