Android fileoutputstream permission denied

ошибка открытия: EACCES (отказано в разрешении)

у меня очень странная проблема с доступом к хранилищу на некоторых устройствах. Приложение работает на моих тестовых устройствах (Nexus 4 & 7, Samsung GS5). Все мои устройства под управлением Android 4.4.2. Но я получил много писем от пользователей, говорящих, что приложение не может писать в хранилище (ни внутреннее хранилище, ни sd-карта). Из файла журнала, полученного от отзывов пользователей, я вижу, что проблема заключается в следующем коде:

он выдает исключение в строке fStream = new FileOutputStream (filename, true); при создании FileOutputStream.

в AndroidManifest.xml у меня есть следующие объявленные разрешения:

Я подтвердил, что пользователи используют личное приложение на SD-карте. И что еще более странно, что он не может писать во внутреннюю память. Как это может произойти, если у меня есть разрешения на чтение и запись? Пользователи говорят, что они не подключают свои устройства на ПК в то время.

оказывается, я слишком часто вызываю open и close FileOutputStream, что в какой-то момент вызывает FileNotFoundException. Больше похоже на проблему с потоками.

13 ответов

я столкнулся с аналогичной проблемой некоторое время назад.

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

Если вы записываете файл в определенное место на SD-карте, попробуйте использовать переменные среды. Они всегда должны указывать на действительное местоположение. Вот пример записи в папку downloads:

Если вы запись файла во внутреннее хранилище приложения. Попробуйте следующий пример:

лично я полагаюсь на внешние библиотеки для обработки потоковой передачи в файл. Этот еще не подвел меня.

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

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

Если вы уже используете переменные окружения, это может быть проблема с разрешениями. Ознакомьтесь с ответом Джастина Фидлера ниже.

для API 23+ вам нужно запросить разрешения на чтение/запись, даже если они уже есть в вашем манифесте.

в моем случае у меня был неправильный случай в

android.permission должно быть строчным, и каким-то образом вся строка была прописной в нашем источнике.

Я также столкнулся с той же проблемой. После тяжелой работы я понял, что в моем случае было не так. Мое устройство было подключено к компьютеру через USB-кабель. Существуют типы для USB-соединений, таких как массовое хранение, медиа-устройство(MTP), камера(PTP) и т. д. Мой тип соединения был — «массовое хранилище», и это вызывало проблемы. Когда я изменил тип соединения, проблема была решена.

всегда помните при доступе к файловой системе на устройстве android: —

НЕ ПОДКЛЮЧАЙТЕСЬ КАК МАССА Хранение на компьютере / ПК.

в моем случае это была проблема с разрешениями. Загвоздка в том, что на устройстве с Android 4.0.4 я получил доступ к файлу без каких-либо ошибок или исключений. И на устройстве с Android 5.1 это не удалось с исключением доступа (open failed: EACCES (разрешение отказано)). Обработал его с добавлением разрешения follow для манифеста файла:

поэтому я предполагаю, что это разница между управлением разрешениями в версиях ОС, которые вызывают сбои.

сначала дайте или проверьте разрешения, такие как

Если эти два разрешения в порядке, то проверьте, что выходные потоки находятся в правильном формате.

В моем случае я использовал параметр android:isolatedProcess=»true» на service на AndroidManifest.xml .

как только я удалил его, ошибка исчезла.

я столкнулся с той же проблемой и обнаружил, что мне нужно запросить разрешения во время выполнения, даже если я объявил об этом в манифесте. Так же, как и ответ Джастина Фидлера.

Читайте также:  Сервера gmail для андроида

моя реализация немного отличается от ответа Джастина Фидлера, что он также реализует метод onrequestpermissionsresult фрагмента v4 для ручка разрешений «запрос-ответ».

У меня такая же проблема, но Иногда самый сложный вопрос получает простой ответ.

я перепроверяю разрешения манифеста, и was_not пишет разрешение позор мне.

также я нашел решение для моего пути.

перед запуском приложения я предоставил root file-explorer и не отключил разрешение на запись / чтение при выходе из приложения.

мое приложение не может использовать внешнюю память, пока я делал устройство restrat для сброса всех разрешений.

Если клиенты используют Android 6.0, Android добавил новый модель разрешение for (зефир).

трюк: если вы нацелены на версию 22 или ниже, ваше приложение запросит все разрешения во время установки, как и на любом устройстве под управлением ОС ниже Marshmallow

в моем случае проблема заключалась в конфигурации WIFI, которая была статической, имела конфликт с другим устройством, использующим тот же IP-адрес.

в моем случае я забыл добавить / перед именем файла после добавления я избавился от него

Источник

Android 10 open failed: EACCES (Permission denied)

Oct 31, 2019 · 3 min read

Recently for one of the apps that I was working on, we changed the target SDK to API level 29 (Android 10). Ever since the change was made one of our workflows broke. The workflow is simple, we ask the user if they want to upload a logo to their profile. We let the user pick a file from their media gallery and upload this image to the server.

Running this workflow on an Android 10 device failed to upload the images. The error we saw was open failed: EACCES (Permission denied)

So, what changed?

Apps targeting Android 10 (API level 29) and higher are given scoped access into an external storage device, or scoped storage, by default. Such apps can see only their app-specific directory

Also in the documentation

In order to access any other file that another app has created, including files in a “downloads” directory, your app must use the Storage Access Framework, which allows the user to select a specific file.

Back to our workflow, when a user picks a file from the gallery, there is no guarantee that the file that was picked was added or edited by some other app. So, if the user picks on a file that let’s say belongs to another app we would run into the permission issues. So, how do we solve this?

There are a couple of ways to do this, in this article we will look into two ways.

Opt out of scoped storage

If your app is not ready for the changes that are coming in for Android 10 then you can “opt-out” by setting the flag requestLegacyExternalStorage to true in your manifest.

I spoke to one of the developers from the Privacy team during the recent Android dev Summit and their recommendation was to use this solution as a temporary one

Using openFileDescriptor

The idea is to make a copy of the file that the user picks in the media gallery and add it to your application cache directory.

So, the first step is to open the file using openFileDescriptor

Let’s create an input stream from it.

The next step is to get the file name from the URI, we can write an extension function on ContentResolver class for this. Please note that the logic below is inspired by the sample code from android docs.

Alternatively, you can always give your own generated file name.

Now that we know how to get the file name, let’s create a file in our application’s cache directory.

Читайте также:  Open activity from activity android studio

Now let us make OutputStream out of this file

The final step is to copy the contents of the original file to our newly created file in our cache directory.

You can do this step in multiple ways, one easy way is to use the copy function from the IOUtils class(org.apache.commons.io.IOUtils).

Piecing it all together, the final code would be something like this.

Now that your app has a copy of the file that needs to be uploaded, you can now safely upload this to your backend server.

This should fix the permission issues you may face.

Let me know in the comments if this did or did not work for you or if you have other solutions I would love to hear them.

Thanks to Pranay for proofreading and giving me valuable technical feedback.

Источник

Open failed: EACCES (разрешение отклонено)

У меня очень странная проблема с доступом к хранилищу на некоторых устройствах. Приложение работает на моих тестовых устройствах (Nexus 4 и 7, Samsung GS5). Все мои устройства под управлением Android 4.4.2. Но я получил много писем от пользователей, говорящих, что приложение не может писать в хранилище (ни внутреннее хранилище, ни SD-карта). Из файла журнала, полученного от отзывов пользователей, я вижу, что проблема заключается в следующем коде:

Он выдает исключение в строке fStream = new FileOutputStream (имя файла, true); При создании FileOutputStream.

В AndroidManifest.xml я объявляю следующие разрешения:

Я подтвердил, что пользователи используют правильное приложение на SD-карте. И что более странно, так это то, что он не может писать и на внутреннее хранилище. Как это может произойти, если у меня есть права на чтение и запись? Пользователи говорят, что они не подключают свои устройства к ПК в это время.

Оказывается, я слишком часто вызываю open и close FileOutputStream, что в какой-то момент бросает FileNotFoundException. Звучит скорее как проблема с потоками.

Я столкнулся с подобной проблемой некоторое время назад.

Ваша проблема может быть в двух разных областях. Это либо то, как вы создаете файл для записи, либо ваш метод письма может быть испорчен тем, что он зависит от телефона.

Если вы пишете файл в определенном месте на SD-карте, попробуйте использовать переменные среды. Они должны всегда указывать на допустимое местоположение. Ниже приведен пример записи в папку для загрузки:

Если вы пишете файл во внутреннем хранилище приложения. Попробуйте этот пример:

Лично я полагаюсь на внешние библиотеки для обработки потоковой передачи в файл. Это еще не подвело меня.

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

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

Для API 23+ вам необходимо запросить разрешения на чтение и запись, даже если они уже находятся в вашем манифесте.

В моем случае у меня был неправильный случай в

android.permission должен быть строчным, и как-никак вся строка была в верхнем регистре в нашем источнике.

Я также столкнулся с той же проблемой. После тяжелой работы я обнаружил, что было не так в моем случае. Мое устройство было подключено к компьютеру через USB-кабель. Существуют типы подключений USB, таких как Mass Storage, Media Device (MTP), Camera (PTP) и т. Д. Моим типом подключения было «Mass Storage», и это вызывало проблемы. Когда я изменил тип подключения, проблема была решена.

Всегда помните при доступе к файловой системе на устройстве Android: –

НЕ ПОДКЛЮЧИТЕ КАК МАСШТАБНОЕ ХРАНЕНИЕ к компьютеру / ПК.

В моем случае я использовал опцию android:isolatedProcess=»true» для service в AndroidManifest.xml .

Как только я удалил его, ошибка исчезла …

Сначала дайте или проверьте разрешения, например

Если эти два разрешения в порядке, то проверьте, что выходные потоки находятся в правильном формате.

Читайте также:  Пошаговые стрелялки для андроид

Я столкнулся с той же проблемой и обнаружил, что я должен запрашивать разрешения во время выполнения, даже если я объявил это в манифесте. Как сказано в ответе Джастина Фидлера.

Моя реализация немного отличается от ответа Джастина Фидлера о том, что он также реализует метод onRequestPermissionsResult фрагмента v4 для обработки запроса запроса разрешений.

Также я нашел решение для своего пути.

Перед запуском приложения я предоставил root файловому проводнику и не отключил разрешение на запись / чтение при выходе из приложения.

Мое приложение не может использовать внешнюю память, в то время как я заблокировал устройство для сброса всех разрешений.

Если клиенты используют Android 6.0, Android добавила новую модель разрешения для (Marshmallow).

Trick: Если вы ориентируетесь на версию 22 или ниже, ваше приложение будет запрашивать все разрешения во время установки так же, как и на любом устройстве, работающем под ОС ниже Marshmallow

В моем случае это были проблемы с разрешениями. Уловка заключается в том, что на устройстве с Android 4.0.4 я получил доступ к файлу без какой-либо ошибки или исключения. А на устройстве с Android 5.1 он вышел из строя с исключением ACCESS (open failed: EACCES (Permission denied)). Обработала его, добавив следующие действия для манифеста файла:

Поэтому я предполагаю, что разница между управлением разрешениями в версиях ОС приводит к сбоям.

В моем случае проблема заключалась в том, что конфигурация WIFI, статическая, имела конфликт с другим устройством, использующим тот же IP-адрес.

У меня такая же проблема, но иногда, самый проблемный вопрос дает простой ответ.

Я перепроверяю явные разрешения, и там WAS_NOT пишут мне стыд за позор .

Источник

Permission denied: Файл, созданный в … / файлах

Я создаю файл в data / data / myPackage / files /:

Я абсолютно уверен, что файл создан.
Сразу после его создания я звоню:

И результат верен.

Когда я пытаюсь использовать этот файл
Я получаю: «Permission Denied».
В Eclipse, в DDMS, эти права доступа к файлам:

Может ли кто-нибудь помочь здесь?

Самый простой способ открыть файл (и создать его в одно и то же время) – использовать метод openFileOutput(«file.txt», MODE_PRIVATE) .

Это гарантирует, что файл будет доступен только для чтения вашим приложением (так же, как у вас есть на данный момент), плюс он возвращает вам FileOutputStream чтобы вы могли начать писать на него.

Убедитесь, что у вас есть права на запись в файл. В файл манифеста включите эту строку

Разрешения выглядят правильно для меня. Каждое приложение работает как другой пользователь, поэтому имеет доступ только к собственным файлам.

Когда вы говорите «Я пытаюсь использовать этот файл», что вы имеете в виду? Можете ли вы опубликовать код для этого, поскольку я думаю, что в этом проблема.

Если вы знаете, что файл создается с помощью File (), и вы не хотите использовать openFileOutput (), попробуйте это:

Я работаю над проблемой nullpointerexception, файл не найден, в течение нескольких часов. Я перешел с эмулятора на фактическое устройство. В эмуляторе работало:

Когда я пошел прямо на устройство, я получил исключение.
Неэлеш Газендер отлично ответил. Добавление::

В манифесте android решает эту проблему полностью. Я благодарен Нилешу и Кудосу!

Я обнаружил, что для записи «/ data / data / myPackage / files /»,
Необходимо установить разрешения.

Был MODE_WORLD_WRITEABLE,
Это было интересно с этим делом,
Но даже с этим набором разрешений, я все еще получил ошибку.

Я подумал: «Может быть, мне нужно разрешение EXECUTE …».
В API нет такого разрешения
Но хотя я попытался поместить 3 в параметр режима
(MODE_WORLD_WRITEABLE = 2),
И … это сработало!

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

И кстати,
MODE_WORLD_WRITEABLE ошибочен,
MODE_WORLD_WRITABLE прав.

Источник

Оцените статью