Как получить реальный путь из URI файла в SD-карте?

Я использую react-native-document-picker для выбора файлов и отправки их на сервер. После выбора файла я использую RNFetchBlob.fs.stat(uri) из пакета rn-fetch-blob, чтобы получить реальный путь из URI, который мне дает сборщик. Он отлично работает с файлами внутреннего хранилища, но когда я выбираю изображение из раздела «SD-карта», функция stat выдает исключение, которое говорит что-то вроде этого:

не удалось указать путь null, потому что он не существует или это не папка

Удивительно, но когда я выбираю раздел «Изображения», захожу в папку SD-карты и выбираю то же самое изображение, оно работает просто отлично! У меня такая же проблема с разделом "Загрузки".

введите здесь описание изображения

URI, который возвращает средство выбора, это когда я выбираю изображение из раздела «Изображения»:

content://com.android.providers.media.documents/document/image%3A76431

и когда я выбираю из раздела "SD-карта": content://com.android.externalstorage.documents/document/F673-1818%3Abbb.png

Прямо сейчас я использую этот код, но это не правильное решение, потому что оно какое-то грязное и работает не на всех устройствах.

if(uri.substr(0,57) === "content://com.android.externalstorage.documents/document/"){
    let filePath = decodeURIComponent(uri.substr(57));
    let subUri = filePath.replace(/:\s*/g, "/");
    filePath = "/storage/" + subUri;
    return `file://${filePath}`
 }

Есть ли более приятный способ получить реальный путь к файлу на SD-карте из его URI? Я ценю любую идею.

ОС: Андроид


person Zeynab Rostami    schedule 10.02.2020    source источник
comment
Я думаю, это то, что вам нужно Environment.getExternalStorageDirectory()   -  person Vikas Acharya    schedule 10.02.2020
comment
пожалуйста, проверьте этот ответ stackoverflow.com/a/42160238/1992013. Я думаю, что это все еще актуально, несмотря на различные обновления классов/пакетов Android.   -  person Birender Singh    schedule 10.02.2020
comment
Не используйте такие вещи, как получение реального пути из uri. Используйте uri как есть. Нет причин не использовать схему контента напрямую. Поэтому, пожалуйста, скажите, почему вам нужен «настоящий» путь. Даже если вы заставите все работать, это бесполезно для Android Q и более поздних версий. Так что адаптируйтесь к современности.   -  person blackapps    schedule 10.02.2020
comment
проверьте эту ссылку stackoverflow.com/questions/23123461 /   -  person Shivo'ham 0    schedule 10.02.2020
comment
проверьте эту ссылку stackoverflow.com/questions/23123461 /   -  person Shivo'ham 0    schedule 10.02.2020
comment
@blackapps Я хочу загрузить файлы на свой сервер. Без реального пути он отправляет файлы размером 0 байт! У вас есть решение для этого?   -  person Zeynab Rostami    schedule 24.02.2020
comment
Вы можете загружать файлы без «реального пути». Используйте uri, чтобы открыть входной поток и прочитать байты из файла, а затем загрузить эти байты.   -  person blackapps    schedule 24.02.2020