Что это самый простой способ конвертировать из file:
android.net.Uri
к File
в Android?
Пробовал следующее, но это не работает:
final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());
Ответы:
То, что вы хотите, это ...
... и не...
Примечание:
uri.toString()
возвращает строку в формате:"file:///mnt/sdcard/myPicture.jpg"
, аuri.getPath()
возвращает строку в формате:"/mnt/sdcard/myPicture.jpg"
.источник
toString
?url.toString()
возвращает строку в следующем формате: «file: ///mnt/sdcard/myPicture.jpg», тогда какurl.getPath()
возвращает строку в следующем формате: «/mnt/sdcard/myPicture.jpg», т.е. без предварительного типа схемы фиксированный.open failed: ENOENT (No such file or directory)
когда я пытаюсь открыть Файл, данный вместе с этим. Кроме того, если Uri, например, является Content Uri изображения, это определенно не работает.После долгих поисков вот что у меня сработало:
источник
managedQuery
сейчас устарела. используйтеgetContentResolver().query(...)
вместо этого, который работает на API 11+. Добавить условие для устройств старше API 11.использование
напрямую и скопируйте файл. Также см:
https://developer.android.com/guide/topics/providers/document-provider.html
источник
РЕДАКТИРОВАТЬ: Извините, я должен был проверить лучше раньше. Это должно работать:
URI - это java.net.URI.
источник
androidURI
такое android.net.Uri. java.net.URI (который существует на Android) используется только как часть процесса конвертации.java.lang.IllegalArgumentException: Expected file scheme in URI: content://com.shajeel.daily_monitoring.localstorage.documents.localstorage.documents/document/%2Fstorage%2Femulated%2F0%2FBook1.xlsx
исключение после использования этого метода.Лучшее решение
Создайте один простой класс FileUtil и используйте его для создания, копирования и переименования файла.
Я использование
uri.toString()
и ,uri.getPath()
но не работа для меня. Я наконец нашел это решение.Используйте класс FileUtil в своем коде
источник
Ничто из этого не работает для меня. Я нашел это, чтобы быть рабочим решением. Но мой случай специфичен для изображений .
источник
Android + Kotlin
Добавить зависимость для расширений Kotlin Android:
implementation 'androidx.core:core-ktx:{latestVersion}'
Получить файл из URI:
uri.toFile()
Android + Java
Просто перейдите наверх;)
источник
file
С Kotlin это еще проще:
Или, если вы используете расширения Kotlin для Android :
источник
@CommonsWare все объяснил достаточно хорошо. И мы действительно должны использовать предложенное им решение.
Кстати, только информация, на которую мы можем полагаться при запросе,
ContentResolver
- это имя и размер файла, как указано здесь: Получение информации о файле | Разработчики AndroidКак вы могли видеть, есть интерфейс,
OpenableColumns
который содержит только два поля: DISPLAY_NAME и SIZE.В моем случае мне нужно было извлечь EXIF-информацию об изображении JPEG и повернуть ее, если необходимо, перед отправкой на сервер. Для этого я скопировал содержимое файла во временный файл, используя
ContentResolver
иopenInputStream()
источник
Я сделал это следующим образом:
Поэтому сначала я пытаюсь использовать файл, т.е. снимок, сделанный камерой и сохраненный на SD-карте. Это не работает для изображения, возвращаемого: Intent photoPickerIntent = new Intent (Intent.ACTION_PICK); В этом случае необходимо преобразовать Uri в реальный путь с помощью
getRealPathFromURI()
функции. Таким образом, вывод заключается в том, что это зависит от того, какой тип Uri вы хотите преобразовать в File.источник
Если у вас есть то,
Uri
что соответствует,DocumentContract
то вы, вероятно, не хотите использоватьFile
. Если вы находитесь на kotlin, используйтеDocumentFile
для того, что вы делали в старом миреFile
, и используйтеContentResolver
для получения потоков.Все остальное в значительной степени гарантированно сломано.
источник
В этом случае, особенно на Android, путь для байтов обычно быстрее.
После этого я решил эту проблему, установив класс, на
FileHelper
который возложена ответственность за чтение / запись байтов из / в файл через поток, и класс, наUriHelper
который возложена ответственность за определение пути Uri и разрешения.Насколько это известно в целом,
string.getBytes((charset == null) ? DEFAULT_CHARSET:charset)
может помочь нам перевести строку, которую вы хотите, в байты, которые вам нужны.Как позволить UriHelper и FileHelper скопировать изображение, отмеченное Ури, в файл, вы можете запустить:
о моем UriHelper:
}
о моем FileHelper:
}
источник
Для людей, которые здесь ищут решение для изображений, в частности, вот оно.
источник
Файл imageToUpload = новый файл (новый URI (androidURI.toString ())); работает, если это файл, который вы создали во внешнем хранилище.
Например, файл: /// storage / emulated / 0 / (некоторый каталог и имя файла)
источник
public String getRealPathFromURI (Uri uri) {
Затем используйте для получения файла из URI:
- НАДЕЖДА МОЖЕТ ПОМОЧЬ ВАМ ----
источник
С помощью следующего кода я могу получить общий PDF-файл приложения Adobe в виде потока и сохранения в путь приложения Android
источник
Расширение базы на @Jacek Kwiecień ответ для преобразования изображения URI в файл
Если мы используем
File(uri.getPath())
, это не будет работатьЕсли мы используем расширение из Android-KTX , оно все равно не будет работать, потому что https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt
источник
DATA
столбцу (и это был ненадежный подход в первую очередь).Добавить
onActivityResult
, получить docx или pdf файлисточник