java .io.FileNotFoundException: /storage/emulated/0/Download/myFile.pdf: ошибка открытия: EACCES (разрешение отклонено) - PullRequest
0 голосов
/ 28 февраля 2020

С момента выхода Android Q произошли некоторые изменения конфиденциальности в разрешениях на чтение из внешнего хранилища. У меня есть приложение чата, в котором пользователь может выбрать фотографию из списка Загрузки и c ... и отправить ее. Поэтому мне нужно иметь доступ к этим файлам. Я сделал это с помощью contentProvider.

context.contentResolver.openInputStream(uri)?.use { inputStream ->
    while (true) {
       numBytesRead = inputStream.read(buffer)
       // .. do stuff
   }
}


Доступный в то время URI -> file: ///storage/emulated/0/Download/myFile.pdf

Однако я получаю исключение FileNotFoundException, но файл полностью существует.

Я установил все разрешения в манифесте и предоставил их при запуске приложения. С Android <= 9 работает правильно. Так что мне делать ...? </p>

1 Ответ

0 голосов
/ 28 февраля 2020

У меня есть приложение для чата, в котором пользователь может выбрать фотографию из списка Загрузки и c ... и отправить ее

Это не будет возможно для Android 10 и выше. Вам нужно переключиться на что-то другое. Например, вы можете использовать ACTION_OPEN_DOCUMENT, чтобы позволить пользователю выбирать контент из любого места, где он хочет. Затем используйте полученный Uri, чтобы загрузить его на сервер чата, аналогично тому, как вы используете Uri в своем фрагменте кода. Или, что еще лучше, не читайте все это в память - используйте что-то вроде этой реализации OkHttp InputStreamRequestBody .

Для Android 10 вы можете добавить android:requestLegacyExternalStorage="true" к вашему <application> элемент в манифесте. Это выбирает унаследованную модель хранения, и ваш существующий код внешнего хранилища будет работать. Это не будет работать на Android R и выше, так что это только кратковременное исправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...