я получаю
открыть не удалось:
EACCES (Permission denied)
на линии OutputStream myOutput = new FileOutputStream(outFileName);
Я проверил рут и попробовал android.permission.WRITE_EXTERNAL_STORAGE
.
Как я могу решить эту проблему?
try {
InputStream myInput;
myInput = getAssets().open("XXX.db");
// Path to the just created empty db
String outFileName = "/data/data/XX/databases/"
+ "XXX.db";
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
buffer = null;
outFileName = null;
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Ответы:
У меня была такая же проблема ... Это
<uses-permission
было не в том месте. Это правильно:uses-permission
Тег должен быть внеapplication
тега.источник
<uses-permission>
тег появляется после<application>
тега»android:maxSdkVersion="18"
. Это генерировало это исключениеДля API 23+ вам необходимо запросить разрешения на чтение / запись, даже если они уже есть в вашем манифесте.
AndroidManifest.xml
Официальную документацию о запросе разрешений для API 23+ можно найти на странице https://developer.android.com/training/permissions/requesting.html.
источник
У Google появилась новая функция на Android Q : отфильтрованное представление для внешнего хранилища. Быстрое решение проблемы - добавить этот код в файл AndroidManifest.xml:
Вы можете прочитать больше об этом здесь: https://developer.android.com/training/data-storage/compatibility
источник
android:requestLegacyExternalStorage="true"
это не сломает более низкие версии RYT? @UrielFrankelЯ наблюдал это один раз при запуске приложения внутри эмулятора. В настройках эмулятора необходимо правильно указать размер внешнего хранилища («SD-карта»). По умолчанию поле «внешнее хранилище» пустое, и это, вероятно, означает, что такого устройства нет, и EACCES выбрасывается, даже если в манифесте предоставляются разрешения.
источник
В дополнение ко всем ответам, убедитесь, что вы не используете свой телефон в качестве USB-накопителя.
У меня была такая же проблема в HTC Sensation при включенном режиме USB-накопителя. Я все еще могу отлаживать / запускать приложение, но не могу сохранить на внешнее хранилище.
источник
Добавить андроида: requestLegacyExternalStorage = "истина" в Android Manifest Он работал с Android 10 (Q) в SDK 29+
или После перенастройки Android X .
источник
Моя проблема была с "TargetApi (23)", которая необходима, если ваш minSdkVersion ниже 23.
Итак, у меня есть запрос на разрешение со следующим фрагментом
источник
Решение для Android Q :
источник
Я испытываю то же самое. Я обнаружил, что если вы идете в Настройки -> Диспетчер приложений -> Ваше приложение -> Разрешения -> Включить хранилище , это решает проблему.
источник
Оказалось, это была глупая ошибка, так как мой телефон все еще был подключен к настольному ПК и я не осознавал этого.
Поэтому пришлось отключить USB-соединение, и все работало нормально.
источник
У меня была такая же проблема на Samsung Galaxy Note 3, под управлением CM 12.1. Проблема для меня заключалась в том, что у меня было
и должен был использовать это, чтобы взять и сохранить пользовательские фотографии. Когда я попытался загрузить те же самые фотографии в ImageLoader, я получил
(Permission denied)
ошибку. Решение было явно добавитьтак как вышеупомянутое разрешение ограничивает только разрешение на запись до API версии 18, а вместе с ним разрешение на чтение
источник
В дополнение ко всем ответам, если клиенты используют Android 6.0, Android добавил новую модель разрешений для (Marshmallow).
Уловка: если вы нацелены на версию 22 или ниже, ваше приложение будет запрашивать все разрешения во время установки так же, как и на любом устройстве, работающем под ОС ниже Marshmallow. Если вы пытаетесь использовать эмулятор, то начиная с Android 6.0 и далее вам нужно явно перейти в настройки-> приложения-> YOURAPP -> разрешения и изменить разрешение, если вы его дали.
источник
Странно после косой черты "/" перед моим новым файлом моя проблема была решена. Я изменил это:
к этому:
источник
У меня была такая же проблема, и ни одно из предложений не помогло. Но я нашел интересную причину для этого на физическом устройстве Galaxy Tab .
Когда USB-накопитель включен, разрешения на чтение и запись на внешнее хранилище не влияют. Просто отключите USB-накопитель, и с правильными разрешениями проблема будет решена.
источник
Я ожидаю, что все ниже
/data
будет принадлежать «внутреннему хранилищу». Однако вы должны иметь возможность написать/sdcard
.источник
Измените свойство разрешения в вашей
/system/etc/permission/platform.xml
и группе необходимо упомянуть, как показано ниже.
источник
У меня была такая же ошибка, когда я пытался записать изображение в папку DCIM / камера на Galaxy S5 (Android 6.0.1), и я понял, что только эта папка ограничена. Я просто мог написать в DCIM / любую папку, но не в камере. Это должно быть ограничение / настройка на основе бренда.
источник
Когда ваше приложение относится к системному приложению, оно не может получить доступ к SD-карте.
источник
имейте в виду, что даже если вы установили все правильные разрешения в манифесте: единственное место, в которое сторонним приложениям разрешено писать на вашу внешнюю карту, это «их собственные каталоги» (т.е. / sdcard / Android / data /), пытающиеся записать в в другом месте: вы получите исключение: EACCES (В доступе отказано)
источник
Может быть, ответ таков:
на устройствах API> = 23, если вы устанавливаете приложение (приложение не является системным приложением), вы должны проверить разрешение на хранение в разделе «Настройки - приложения», для каждого приложения есть список разрешений, вы должны проверить его! пытаться
источник
В моем случае я использовал библиотеку выбора файлов, которая возвращала путь к внешнему хранилищу, но он начинался с
/root/
. И даже с разрешением WRITE_EXTERNAL_STORAGE, предоставленным во время выполнения, я все равно получил ошибку EACCES (разрешение отклонено) .Так что используйте,
Environment.getExternalStorageDirectory()
чтобы получить правильный путь к внешнему хранилищу.Пример:
не могу написать:
/root/storage/emulated/0/newfile.txt
могу написать:
/storage/emulated/0/newfile.txt
Выход 1:
Выход 2:
источник
root
части из пути решило мою проблему.При использовании этого устаревшего метода с Android 29 и далее вы получите ту же ошибку:
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
Разрешение здесь:
getExternalStoragePublicDirectory устарела в Android Q
источник
Для тех, кто приходит сюда из результатов поиска и ориентируется на Android 10: Android 10 (API 29) меняет некоторые разрешения, связанные с хранением.
Я исправил эту проблему, когда заменил свои предыдущие экземпляры
Environment.getExternalStorageDirectory()
(что устарело в API 29) наcontext.getExternalFilesDir(null)
.Обратите внимание, что
context.getExternalFilesDir(type)
может возвращать ноль, если место хранения недоступно, поэтому обязательно проверяйте это всякий раз, когда проверяете, есть ли у вас внешние разрешения.Узнайте больше здесь .
источник
Я создаю папку в / data / в моем init.rc (возиться с aosp на Nexus 7) и имел именно эту проблему.
Оказалось, что предоставления разрешения для папки rw (666) было недостаточно, и это должно было быть rwx (777), тогда все работало!
источник
Применение разрешений на хранение после 6.0 можно обойти, если у вас есть рутированное устройство с помощью этих команд adb:
источник
Добавить разрешение в манифест.
источник
android.permission.READ_INTERNAL_STORAGE
У меня была такая же проблема (API> = 23).
Решение https://stackoverflow.com/a/13569364/1729501 у меня сработало, но отключить приложение для отладки было непрактично.
Мое решение состояло в том, чтобы установить правильный драйвер устройства ADB на Windows. Драйвер USB Google не работает для моего устройства.
ШАГ 1: Загрузите драйверы adb для вашего устройства.
ШАГ 2: Зайдите в диспетчер устройств -> другие устройства -> найдите записи со словом «adb» -> выберите «Обновить драйвер» -> укажите местоположение на шаге 1
источник
после добавления разрешения решил мою проблему
источник
Добавить зависимости gradle
Добавьте ниже код в вашей основной деятельности.
источник
В моем случае ошибка появлялась на линии
так как я не мог создать новый файл на SD-карте, поэтому мне пришлось использовать подход DocumentFile.
Для вышеуказанного вопроса проблема может быть решена с помощью этого подхода,
См. Также эту ветку. Как использовать новый API доступа к SD-карте, представленный для Android 5.0 (Lollipop)?
источник