android.system.ErrnoException: ошибка открытия: ENOENT (Нет такого файла или каталога), файл существует в пути с именем

Я пытаюсь отправить изображение на свой сервер apollo-graphql, но получаю следующую ошибку:

android.system.ErrnoException: ошибка открытия: ENOENT (Нет такого файла или каталога)

Это код Android:

lifecycleScope.launch {
                    val response = try {
                        apolloClient(requireContext()).mutate(
                            SubirImagenMutation(
                                imagenData = FileUpload("image/jpg", File(imagen.path!!).toString())
                            )
                        ).toDeferred().await()
                    } catch (e: ApolloException) {
                        Toasts().visualizarToast(requireContext(), getString(R.string.str_err_generico))
                        return@launch
                    }
                    findNavController().navigate(R.id.serviciosFragment)
                }

Путь изображения:

/document/1804-2E16:DCIM/definicion-de-persona-min.jpg: открыть не удалось: ENOENT (Нет такого файла или каталога)

Разрешения приложения:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Заранее спасибо.


person AlejandroOO    schedule 09.10.2020    source источник
comment
Ошибка не в этом коде... настоящая проблема в том, что вы используете неправильный код для получения пути из uri... так как единственный хороший способ: создать новый файл и скопировать содержимое из uri к этому файлу и использовать его путь (или использовать содержимое напрямую) ... подобные вопросы задаются снова и снова, потому что некоторые чуваки ставят +1 за неправильные ответы   -  person Selvin    schedule 09.10.2020


Ответы (1)


не каждый URI может быть разрешен как строгий путь к файлу в файловой системе. например некоторые средства выбора файлов могут возвращать файл, помещенный в какое-либо облачное хранилище...

в вашем случае URI указывает на /document/1804-2E16:DCIM/definicion-de-persona-min.jpg, что неверно для shure. вы, вероятно, получаете URI похожее на это /document/1804-2E16, думая, что это путь к каталогу, поэтому вы добавляете String имя файла, но это не так... ваш настоящий исходный и полный путь к файлу выглядит примерно так:

content://com.android.providers.downloads.documents/document/1804-2E16

ни имени файла, ни формата файла, только указатель - URI

прочтите о FileProvider и ознакомьтесь с ЭТА тема для некоторой информации как получить доступ к таким файлам. исправление этой ошибки не тривиально, короче говоря, вам нужно обрабатывать некоторые файловые потоки

person snachmsm    schedule 09.10.2020
comment
Вручную проверяя путь, я получаю ту же ошибку: File(content://com.android.externalstorage.documents/document/1804-2E16:DCIM/definicion-de-persona-min.jpg) - person AlejandroOO; 09.10.2020
comment
это НЕ путь к файлу! это URI указывает на файл, который может храниться где угодно, поэтому его можно преобразовать только в поток. File объект может быть создан только из URI начиная с file://. и нет, ручная замена content:// на file:// не исправит это. похоже, вы вообще не читали мой ответ и, конечно, не читали связанный документ и тему на SO... - person snachmsm; 09.10.2020