Исключение «Не удалось открыть: EACCES (В доступе отказано)» на Android - PullRequest
230 голосов
/ 13 января 2012

Я получаю

Ошибка открытия: 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();
}

Ответы [ 26 ]

5 голосов
/ 04 декабря 2013

Изменить свойство разрешения в вашем /system/etc/permission/platform.xml
и группа должна быть упомянута как показано ниже.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
    <group android:gid="sdcard_rw" />
    <group android:gid="media_rw" />    
</uses-permission>
5 голосов
/ 21 августа 2016

У меня была такая же ошибка, когда я пытался записать изображение в папку DCIM / камера на Galaxy S5 (Android 6.0.1), и я понял, что только эта папка ограничена.Я просто мог написать в DCIM / любую папку, но не в камере.Это должно быть ограничение / настройка на основе бренда.

5 голосов
/ 13 января 2012

Я ожидаю, что все, что ниже /data, будет принадлежать «внутренней памяти».Однако вы должны иметь возможность писать в /sdcard.

5 голосов
/ 18 декабря 2016

Странно после добавления косой черты "/" перед моим newFile моя проблема была решена.Я изменил это:

File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");

на это:

File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");
4 голосов
/ 21 ноября 2012

Когда ваше приложение относится к системному приложению, оно не может получить доступ к SD-карте.

3 голосов
/ 25 декабря 2018

имейте в виду, что даже если вы установите все правильные разрешения в манифесте: приложениям сторонних разработчиков разрешено записывать только на вашу внешнюю карту, это "их собственные каталоги" (т.е. / sdcard / Android / data /), пытающиесянаписать куда-нибудь еще: вы получите исключение: EACCES (В доступе отказано)

3 голосов
/ 28 августа 2017

В моем случае я использовал библиотеку для выбора файлов , которая возвращала путь к внешнему хранилищу, но начиналась с /root/. И даже с разрешением WRITE_EXTERNAL_STORAGE , предоставленным во время выполнения, я все еще получаю ошибку EACCES (разрешение отклонено) .
Поэтому используйте Environment.getExternalStorageDirectory(), чтобы получить правильный путь к внешнему хранилищу.

Пример:
Невозможно написать: /root/storage/emulated/0/newfile.txt
Можно написать: /storage/emulated/0/newfile.txt

boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();

Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

Выход 1:

externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0

Выход 2:

externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488
3 голосов
/ 28 апреля 2017

Может быть, ответ таков:

на API> = 23 устройства, если вы устанавливаете приложение (приложение не является системным приложением), вам нужно проверить разрешение хранилища в «Настройка - приложения», для каждого приложения есть список разрешений, его нужно проверить ! попробовать

2 голосов
/ 06 января 2015

Я создаю папку в / data / в моем init.rc (возиться с aosp на Nexus 7) и имел именно эту проблему.

Оказалось, что предоставление папки rw (666)разрешения было недостаточно, и это должно было быть rwx (777), тогда все работало!

2 голосов
/ 07 апреля 2016

Применение разрешений хранилища после 6.0 можно обойти, если у вас есть рутированное устройство с помощью следующих команд adb:

root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive
...