Get File Path From URI in Android JAVA
In Android when we pick an image, video, or any other type of file from the gallery, documents folder, or capture directly from the camera, we receive a URI object in intent. We have different ways to get a full file path from URI based on content providers. In this article, we will discuss how to get a file path from URI in Android for the coming files picked through Storage, Documents, as well as depending upon the _data field for the MediaStore and other file-based ContentProviders.
Following is the Java code if you are looking for Kotlin solution visit this Get Path From URI In Kotlin.
Utility Class to Get File Path From URI in Android
Create a file UriUtils.java and copy the following class in that file.
How to use UriUtils class
You might think that this class is too lengthy, but as mentioned above it handles all scenarios. It checks all android versions and the folders to what the Uri is appointing. It handles different types of content providers. There are different methods depending upon documents path, is it coming through downloads folder or media directory. It also checks is it picked through SECONDARY_STORAGE or EXTERNAL_STORAGE. Few other scenarios like Google Photos Uri, Google drive Uri are also handled properly. Just copy this class in your project as a utility class and rest will be handled by it.
That’s it. This is how to get file path from URI in Java Android.
Источник
android получить реальный путь по Uri.getPath()
Я пытаюсь получить изображение из галереи.
после того, как я вернулся из этой деятельности у меня есть данные, которые содержат Uri. Это выглядит так:
как я могу преобразовать этот путь в реальный (так же, как’ /sdcard/image.png ‘)?
9 ответов:
это действительно необходимо для вас, чтобы получить физический путь?
Например, ImageView.setImageURI() и ContentResolver.openInputStream() позволит вам получить доступ к содержимому файла, не зная его реальный путь.
Примечание: managedQuery() метод устарел, поэтому я его не использую.
последнее редактирование: улучшение. Мы должны закрыть курсор!!
@Rene Juuse-выше в комментариях. Спасибо за эту ссылку !
. код для получения реального пути немного отличается от одного SDK к другому, поэтому ниже мы имеем три метода, которые имеют дело с различными SDK.
getRealPathFromURI_API19 (): возвращает реальный путь для API 19 (или выше, но не протестирован) getRealPathFromURI_API11to18 (): возвращает реальный путь для API 11 в API 18 getRealPathFromURI_below11 (): возвращает реальный путь для API ниже 11
обновление 2016 марта
чтобы исправить все проблемы с путем изображений я пытаюсь создать пользовательскую галерею, как facebook и другие приложения. Это потому, что вы можете использовать только локальные файлы ( реальные файлы , а не виртуальные или временные), я решаю все проблемы с этой библиотекой.
https://github.com/nohana/Laevatein (эта библиотека, чтобы сделать снимок с камеры или выбрать из галереи , если вы выбираете из галереи у него есть ящик с альбомами и просто показать локальные файлы)
Примечание это улучшение в @user3516549 ответ и я должен проверить его на Moto G3 с Android 6.0.1
У меня есть эта проблема, поэтому я попытался ответить на @user3516549, но в некоторых случаях он не работал должным образом. Я обнаружил, что в Android 6.0(или выше) при запуске gallery image pick intent откроется экран, который показывает последние изображения, когда пользователь выбирает изображение из этого списка, мы получим uri как
в то время как если пользователь выбирает галерея из выдвижного ящика вместо недавнего, то мы получим uri как
так что я должен справиться с этим в getRealPathFromURI_API19()
EDIT: если вы пытаетесь получить путь к изображению файла во внешней sdcard в более высокой версии, то проверьте у меня вопрос
нет никакого реального пути.
A Uri с content схема является непрозрачным дескриптором для некоторого содержимого. Если что Uri представляет собой открытый контент, вы можете использовать ContentResolver и openInputStream() для получения InputStream на этот контент. Кроме того, Uri с http или https схема не представляет локальный файл, и вам нужно будет использовать API HTTP-клиента для доступа к нему.
только a Uri с file схема идентифицирует файл (за исключением случаях, когда файл был перемещен или удален после ).
что делают глупые люди, это пытаются получить путь к файловой системе, пытаясь декодировать содержимое Uri , возможно, в сочетании с заклинаниями для вызова $EVIL_DEITY . В лучшем случае, это будет ненадежно, по трем причинам:
правила декодирования Uri значения могут меняться с течением времени, например, с выпусками версий Android, как структура Uri представляет деталь реализации, а не интерфейс
даже если вы получаете путь к файловой системе, у вас может не быть прав доступа к файлу
не все Uri значения могут быть декодированы с помощью фиксированных алгоритмов, так как многие приложения имеют своих поставщиков, а те могут указать на все активы BLOB столбцы для данных, которые должны быть переданы из интернета
если у вас есть некоторые ограниченные API, что требуется файл, используйте InputStream С openInputStream() создать копию этого контента. Является ли это временной копией (например, используется для операции загрузки файла, а затем удаляется) или прочной копией (например, для функции «импорт» вашего приложения) зависит от вас.
во-первых, спасибо за ваше решение @luizfelipetx
Я немного изменил ваше решение. Это работает для меня:
Примечание: таким образом, мы получили документы и изображения, в зависимости от того, если изображение приходит из «recents», «галерея» или что-либо еще. Поэтому я сначала извлекаю идентификатор изображения, прежде чем искать его.
Hii вот мой полный код для получения изображения с камеры или galeery
/ / мое объявление переменной
это помогло мне получить uri из галереи и конвертировать в файл для многоступенчатой загрузки
Попробуй Такое
тем не менее, если вы получаете проблему, чтобы получить реальный путь, вы можете попробовать мои ответы. Выше ответы мне не помогли.
объяснение: — этот метод получает URI, а затем проверить уровень API вашего Android устройства после этого в соответствии с уровнем API он будет генерировать реальный путь. код для генерации реального пути отличается в зависимости от уровней API.
Источник
Преобразование файла: Uri в файл в Android
какой самый простой способ конвертировать из file: android.net.Uri до File В Android?
пробовал следующее, Но это не работает:
15 ответов
то, что вы хотите.
Примечание: uri.toString() возвращает строку в формате: «file:///mnt/sdcard/myPicture.jpg» , тогда как uri.getPath() возвращает строку в формате: «/mnt/sdcard/myPicture.jpg» .
после долгого поиска это то, что сработало для меня:
EDIT: Извините, я должен был протестировать лучше раньше. Это должно сработать:
ничего из этого не работает для меня. Я нашел это рабочим решением. но мой случай специфичен для изображений.
непосредственно и скопируйте файл. См. также:
С Котлином еще проще:
Я сделал это следующим образом:
поэтому в основном сначала я пытаюсь использовать файл, т. е. снимок, сделанный камерой и сохраненный на SD-карте. Это не работает для изображения возвращаемых: Intent photoPickerIntent = новое намерение(намерение.ACTION_PICK); В этом случае необходимо преобразовать Uri в реальный путь по
@CommonsWare объяснил все вещи довольно хорошо. И мы действительно должны использовать предложенное им решение.
кстати, только на информацию мы могли положиться, когда quering ContentResolver — Это имя и размер файла, как указано здесь: получение информации о файле / разработчики Android
как вы могли видеть, есть интерфейс OpenableColumns который содержит только два поля: DISPLAY_NAME и SIZE.
в моем случае мне нужно было получить информацию EXIF о JPEG изображение и повернуть его, если это необходимо перед отправкой на сервер. Для этого я скопировал содержимое файла во временный файл с помощью ContentResolver и openInputStream()
Лучшим Решением
создайте один простой класс java FileUtil и используйте для создания, копирования и переименования файла
Я использую uri.toString() и uri.getPath() но не работает для меня. Я наконец нашел решение.
пользовательский класс FileUtil в вашем коде
вы можете получить файл из файла Uri, используя следующий метод. Он DocumentFile для параметра, но вы можете легко изменить его. Самый простой способ проверить этот метод для создания файла uri с помощью DocumentFile.fromFile(Environment.getExternalStorageDirectory()); который имеет Uri file:///storage/emulated/0
вместо создания файлов из Uri используйте DocumentFile.fromTreeUri(Context, Uri) или DocumentFile.fromSingleri(Context, Uri) для создания или удаления файлов и для потоков используйте getContentResolver().openOutputStream(documentFile.getUri()) и getContentResolver().openInputStream(documentFile.getUri()) для записи файлов и чтения файлов.
публичная строка getRealPathFromURI(Uri uri) <
затем, используя для получения файла из URI:
— НАДЕЖДА МОЖЕТ ПОМОЧЬ ВАМ — — — —
Android + Котлин
добавить зависимость для расширений Kotlin Android:
получить файл из uri:
Android + Java
просто переместить наверх 😉
следующим кодом я могу получить общий pdf-файл adobe application в виде потока и сохранить его в путь приложения android
для людей, которые ищут решение для изображений в частности вот это.
Источник
Получить имя файла и путь от URI из mediastore
У меня есть onActivityResult возврат из выбора образа медиастазы, в котором я могу получить URI для изображения, используя следующее:
Преобразование этого в строку дает это:
Или дорожке дает:
Однако я не могу найти способ преобразовать это в абсолютный путь, поскольку я хочу загрузить изображение в растровое изображение, не копируя его куда-либо. Я знаю, что это можно сделать с помощью URI и распознавателя контента, но, похоже, это не работает при перезагрузке телефона, я думаю, MediaStore что между перезагрузками его нумерация не меняется.
Ниже API 19 используйте этот код для получения пути к файлу из URI:
Просто простое обновление первого ответа: mActivity.managedQuery() сейчас не рекомендуется. Я обновил код с новым методом.
Для всех версий ниже Oreo я сделал этот метод, который получает реальный путь от URI
Не пытайтесь найти URI в файловой системе, потому что поискать информацию в базе данных очень медленно.
Вы можете получить растровое изображение из URI, передавая поток ввода на фабрику так же, как вы передаете файл на фабрику:
Вот мой пример получения имени файла из URI, такого как file: // . и content: // . Это работает для меня не только с Android MediaStore, но и с приложением третьей стороны, таким как EzExplorer.
Хорошие существующие ответы, некоторые из которых я придумывал, свои собственные:
Я должен получить путь из URI и получить URI из путей, и Google с трудом может объяснить разницу, поэтому для всех, у кого есть такая же проблема (например, чтобы получить миниатюру из MediaStore видео, физическое местоположение которого у вас уже есть) ). Первый:
Последний (который я делаю для видео, но также может быть использован для аудио или файлов или других типов хранимого контента, заменив MediaStore.Audio (и т. Д.) На MediaStore.Video):
По сути, в DATA столбце MediaStore (или в каком-либо его подразделе, к которому вы обращаетесь) хранится путь к файлу, поэтому вы либо используете то, что знаете, чтобы найти это DATA поле, либо используете это поле для поиска того, что вы хотите.
Затем я использую, Scheme как указано выше, чтобы выяснить, что делать с моими данными:
Источник