421 Stimmen

Exception 'open failed: EACCES (Berechtigung verweigert)' auf Android

Ich bekomme

öffnen fehlgeschlagen: EACCES (Permission denied)

auf der Linie OutputStream myOutput = new FileOutputStream(outFileName);

Ich habe die Wurzel überprüft und versucht android.permission.WRITE_EXTERNAL_STORAGE .

Wie kann ich dieses Problem beheben?

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();
}

4voto

user2965003 Punkte 326
Environment.getExternalStoragePublicDirectory();

Wenn Sie diese veraltete Methode ab Android 29 verwenden, erhalten Sie denselben Fehler:

java.io.FileNotFoundException: open failed: EACCES (Permission denied)

Auflösung hier:

getExternalStoragePublicDirectory veraltet in Android Q

4voto

Elad Punkte 1363

Denken Sie daran, dass Sie auch dann, wenn Sie im Manifest die richtigen Berechtigungen festgelegt haben: Der einzige Ort, an dem Anwendungen von Drittanbietern auf Ihrer externen Karte schreiben dürfen, sind "ihre eigenen Verzeichnisse" (d.h. /sdcard/Android/data/) Wenn Sie versuchen, an einen anderen Ort zu schreiben, erhalten Sie eine Ausnahme: EACCES (Erlaubnis verweigert)

4voto

will Punkte 41

Wenn Ihre Anwendung zur Systemanwendung gehört, kann sie nicht auf die SD-Karte zugreifen.

3voto

vovahost Punkte 29502

In meinem Fall habe ich eine Dateipicker-Bibliothek der den Pfad zum externen Speicher zurückgab, aber er startete von /root/ . Und selbst mit dem WRITE_EXTERNAL_STORAGE Erlaubnis zur Laufzeit erteilt, bekomme ich immer noch den Fehler EACCES (Erlaubnis verweigert) .
Verwenden Sie also Environment.getExternalStorageDirectory() um den richtigen Pfad zum externen Speicher zu erhalten.

Beispiel:
Kann nicht schreiben: /root/storage/emulated/0/newfile.txt
Kann schreiben: /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;
}

Ausgang 1:

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

Ausgang 2:

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

2voto

Zakir Punkte 2172

Die Post-6.0-Erzwingung von Speicherberechtigungen kann umgangen werden, wenn Sie ein verwurzeltes Gerät mit diesen adb-Befehlen haben:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X