Исключение «Не удалось открыть: EACCES (В доступе отказано)» на Android
не удалось открыть: EACCES (Permission denied)
На линии OutputStream myOutput = new FileOutputStream(outFileName);
Я проверил корень и попробовал android.permission.WRITE_EXTERNAL_STORAGE .
Как я могу исправить эту проблему?
30 ответов
У меня была такая же проблема . был не в том месте. Это правильно:
Тег uses-permission должен находиться за пределами тега application .
В дополнение ко всем ответам, если клиенты используют Android 6.0, Android добавил новый модель разрешений для (Marshmallow).
Уловка: если вы ориентируетесь на версию 22 или ниже, ваше приложение будет запрашивать все разрешения во время установки, как и на любом устройстве под управлением ОС ниже Marshmallow. Если вы пытаетесь использовать эмулятор, то начиная с Android 6.0 и далее вам необходимо явно перейти в настройки-> приложения-> YOURAPP-> разрешения и изменить разрешение, если вы его дали.
У меня была такая же проблема на Samsung Galaxy Note 3, работающем под управлением CM 12.1. Проблема для меня заключалась в том, что у меня
И должен был использовать его для съемки и хранения пользовательских фотографий. Когда я попытался загрузить те же фотографии в ImageLoader, я получил ошибку (Permission denied) . Решение заключалось в том, чтобы явно добавить
Поскольку указанное выше разрешение ограничивает только разрешение на запись до версии API 18, а вместе с ним и разрешение на чтение.
Android 10 (API 29) представляет хранилище с ограниченным объемом . Изменение манифеста для запроса устаревшего хранилища не является долгосрочным решением.
Я исправил проблему, когда заменил свои предыдущие экземпляры Environment.getExternalStorageDirectory() (который устарел в API 29) на context.getExternalFilesDir(null) .
Обратите внимание, что context.getExternalFilesDir(type) может возвращать null, если место хранения недоступно, поэтому обязательно проверяйте это всякий раз, когда проверяете, есть ли у вас внешние разрешения.
Дополнительные сведения см. здесь.
Оказалось, это была глупая ошибка, поскольку мой телефон все еще был подключен к настольному ПК, и я не осознавал этого.
Поэтому мне пришлось отключить USB-соединение, и все заработало.
Я испытываю то же самое. Я обнаружил, что если вы перейдете в Настройки -> Диспетчер приложений -> Ваше приложение -> Разрешения -> Включить хранилище , проблема решится.
Имейте в виду, что решение:
Является временным, рано или поздно ваше приложение должно быть переведено на использование Scoped Storage .
В Android 10 вы можете использовать предложенное решение для обхода системных ограничений, но в Android 11 (R) it is mandatory to use scoped storage ваше приложение может сломаться, если вы продолжите использовать старую логику!
Это видео может быть хорошим подспорьем.
Моя проблема была с «TargetApi (23)», которая необходима, если ваша minSdkVersion ниже 23.
Итак, у меня есть запрос на разрешение со следующим фрагментом
Решение для Android Q :
В дополнение ко всем ответам убедитесь, что вы не используете свой телефон в качестве USB-накопителя.
У меня была такая же проблема с HTC Sensation при включенном режиме USB-накопителя. Я все еще могу отлаживать / запускать приложение, но не могу сохранить его во внешнем хранилище.
Я наблюдал это однажды, когда запускал приложение внутри эмулятора. В настройках эмулятора нужно правильно указать размер внешнего хранилища («SD Card»). По умолчанию поле «внешнее хранилище» пусто, и это, вероятно, означает, что такого устройства нет и EACCES выдается, даже если разрешения предоставлены в манифесте.
Добавьте android: requestLegacyExternalStorage = «true» в манифест Android. Работает с Android 10 (Q) в SDK 29+
или после перехода на Android X .
У Google появилась новая функция в Android Q : представление с фильтром для внешнего хранилища. Быстрое решение этой проблемы — добавить этот код в файл AndroidManifest.xml:
Для API 23+ вам необходимо запросить разрешения на чтение / запись, даже если они уже есть в вашем манифесте.
Добавить зависимости Gradle
Добавьте приведенный ниже код в свою основную деятельность.
У меня была такая же проблема (API> = 23).
Решение https://stackoverflow.com/a/13569364/1729501 сработало для меня, но было непрактично отключать приложение для отладки.
Мое решение состояло в том, чтобы установить правильный драйвер устройства adb в Windows. Драйвер Google USB не работал на моем устройстве.
ШАГ 1. Загрузите драйверы adb для вашего устройства.
ШАГ 2: Перейдите в диспетчер устройств -> другие устройства -> найдите записи со словом «adb» -> выберите «Обновить драйвер» -> укажите местоположение на шаге 1.
Добавить разрешение в манифест.
Сохранение файла в directory , который является чужим для каталога приложения, ограничено выше API 29+ . Итак, чтобы сгенерировать новый файл или создать новый файл, используйте каталог вашего приложения следующим образом: —
Итак, правильный подход: —
Вы можете записать любые данные в этот сгенерированный файл!
Вышеупомянутый file доступен и не будет throw any exception , потому что он находится в каталоге вашего собственного разработанного приложения .
Другой вариант — android:requestLegacyExternalStorage=»true» в manifest application tag , как предлагает Uriel , но это не постоянное решение!
Принудительное применение разрешений на хранилище после версии 6.0 можно обойти, если у вас есть рутированное устройство, с помощью следующих команд adb:
Я создаю папку в / data / в моем init.rc (возится с aosp на Nexus 7) и имел именно эту проблему.
Оказалось, что разрешения папки rw (666) было недостаточно, и это должно было быть rwx (777), тогда все сработало!
В моем случае я использовал библиотеку выбора файлов, которая возвращала путь к внешнему хранилищу, но запускалась от /root/ . И даже с разрешением WRITE_EXTERNAL_STORAGE , предоставленным во время выполнения, я все равно получал ошибку EACCES (Permission denied) .
Поэтому используйте Environment.getExternalStorageDirectory() , чтобы получить правильный путь к внешнему хранилищу.
Пример:
Не могу писать: /root/storage/emulated/0/newfile.txt
Может писать: /storage/emulated/0/newfile.txt
При использовании этого устаревшего метода начиная с Android 29 вы получите ту же ошибку:
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
Имейте в виду, что даже если вы установили все правильные разрешения в манифесте: единственное место, где сторонним приложениям разрешено писать на вашей внешней карте, — это «их собственные каталоги» (т.е. / sdcard / Android / data /), пытающиеся писать в в другом месте: вы получите исключение: EACCES (в разрешении отказано)
Когда ваше приложение принадлежит системному приложению, оно не может получить доступ к SD-карте.
Может быть, ответ такой:
На устройствах с API> = 23, если вы устанавливаете приложение (приложение не является системным), вы должны проверить разрешение хранилища в «Настройки — приложения», есть список разрешений для каждого приложения, вы должны проверить его! пытаться
У меня была такая же ошибка, когда я пытался записать изображение в папку DCIM / camera на Galaxy S5 (android 6.0.1), и я понял, что только эта папка ограничена. Я просто мог писать в DCIM / любую папку, но не в камеру. Это должно быть ограничение / настройка на основе бренда.
Измените свойство разрешения в вашем /system/etc/permission/platform.xml
и группа должна быть упомянута, как показано ниже.
Я ожидаю, что все, что ниже /data , будет принадлежать «внутренней памяти». Однако у вас должна быть возможность писать на /sdcard .
У меня была такая же проблема, и ни одно из предложений не помогло. Но я нашел для этого интересную причину на физическом устройстве, Galaxy Tab.
Когда USB-накопитель включен, разрешения на чтение и запись для внешнего накопителя не действуют. Просто отключите USB-накопитель, и с правильными разрешениями проблема будет решена.
Как ни странно, после того, как перед моим newFile была поставлена косая черта «/» , моя проблема была решена. Я изменил это:
ОБНОВЛЕНИЕ : как упоминалось в комментариях, правильный способ сделать это:
Источник
Ошибка при открытии не удалось: ошибка EACCES (Permission denied) при попытке записать данные на SD-карту в Android 5.1, почему?
Мне нужно сохранить некоторые данные на SD-карту, я добавлю разрешение на файл AndroidManifest.xml, и я могу получить правильный результат, когда тестирую его на Android 4.12 mobile.
Но я не могу выйти из строя: ошибка EACCES (Permission denied), когда я тестирую его на мобильном телефоне Android 5.1, почему?
BTW, я прочитал, что искусственный Android 6.0 открылся неудачно: EACCES (Permission denied) и Exception ‘open failed: EACCES (Permission denied)’ на Android , но теперь моим мобильным телефоном является SamSung Android 5.1
Код
AndroidManifest.xml
build.gradle
Вам не хватает разрешений во время выполнения, установленных на Android Lollipop. Что вы можете сделать, так это разрешение. Для этого перейдите к
Settings -> Apps -> YOUR_APP -> Permissions
И разрешить разрешения, а затем проверить его.
Чтобы добавить разрешение во время выполнения, вы можете запросить внутри onCreate() .
И затем слушайте принятие или отрицание разрешения, как это,
Потому что у вас есть targetSdkVersion 23 поэтому вы получаете исключение безопасности, вам нужно понизить до targetSdkVersion 22 или добавить разрешение времени выполнения. Проверьте эту ссылку https://developer.android.com/training/permissions/requesting.html.
Обновление: open failed: EACCES (Permission denied)
Начиная Kitkat, Android ограничивает доступ на запись SDCARD к сторонним приложениям. Они представили платформу доступа к хранилищу для выполнения операций. Для записи в файлы на SDCard вам нужно будет использовать эти API.
Для некоторых устройств, работающих с Lollipop, вы можете получить доступ на запись к файлам с помощью этих api. Поскольку я сам не использовал api, я не могу предоставить вам фрагмент. Но ссылка, безусловно, поможет вам решить проблему.
Вы можете взглянуть на Es Explorer, чтобы увидеть, как они справляются с этим сценарием.
Источник
ошибка открытия: 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 .
как только я удалил его, ошибка исчезла.
я столкнулся с той же проблемой и обнаружил, что мне нужно запросить разрешения во время выполнения, даже если я объявил об этом в манифесте. Так же, как и ответ Джастина Фидлера.
моя реализация немного отличается от ответа Джастина Фидлера, что он также реализует метод onrequestpermissionsresult фрагмента v4 для ручка разрешений «запрос-ответ».
У меня такая же проблема, но Иногда самый сложный вопрос получает простой ответ.
я перепроверяю разрешения манифеста, и was_not пишет разрешение позор мне.
также я нашел решение для моего пути.
перед запуском приложения я предоставил root file-explorer и не отключил разрешение на запись / чтение при выходе из приложения.
мое приложение не может использовать внешнюю память, пока я делал устройство restrat для сброса всех разрешений.
Если клиенты используют Android 6.0, Android добавил новый модель разрешение for (зефир).
трюк: если вы нацелены на версию 22 или ниже, ваше приложение запросит все разрешения во время установки, как и на любом устройстве под управлением ОС ниже Marshmallow
в моем случае проблема заключалась в конфигурации WIFI, которая была статической, имела конфликт с другим устройством, использующим тот же IP-адрес.
в моем случае я забыл добавить / перед именем файла после добавления я избавился от него
Источник