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

15voto

Tobias Reich Punkte 4714

Wie sich herausstellte, war dies ein dummer Fehler, da ich mein Telefon noch mit dem Desktop-PC verbunden hatte und dies nicht bemerkte.

Also musste ich die USB-Verbindung abschalten und alles funktionierte einwandfrei.

13voto

ZooS Punkte 628

Ich hatte das gleiche Problem auf dem Samsung Galaxy Note 3, auf dem CM 12.1 läuft. Das Problem für mich war, dass ich hatte

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18"/>

und musste es zum Aufnehmen und Speichern von Benutzerfotos verwenden. Als ich versuchte, die gleichen Fotos in ImageLoader zu laden, erhielt ich die Meldung (Permission denied) Fehler. Die Lösung war, explizit hinzuzufügen

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

da die obige Berechtigung nur die Schreibberechtigung bis zur API-Version 18 einschränkt, und damit auch die Leseberechtigung.

10voto

Nourdine Alouane Punkte 783

Zusätzlich zu allen Antworten, wenn die Clients Android 6.0 verwenden, hat Android neue Genehmigungsmodell für (Marshmallow).

Trick: Wenn Sie auf Version 22 oder darunter abzielen, wird Ihre Anwendung bei der Installation alle Berechtigungen anfordern, so wie es auf jedem Gerät mit einem Betriebssystem unter Marshmallow der Fall wäre. Wenn Sie es auf dem Emulator versuchen, müssen Sie ab Android 6.0 explizit zu Einstellungen->Anwendungen->IhreApp->Zugriffsrechte gehen und die Zugriffsrechte ändern, falls Sie welche erteilt haben.

9voto

Darush Punkte 10393

Seltsamerweise wird nach einem Schrägstrich "/" vor meinem newFile war mein Problem gelöst. Ich habe dies geändert:

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

dazu:

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

UPDATE : Wie in den Kommentaren erwähnt, ist der richtige Weg, dies zu tun:

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

6voto

Santanu Sur Punkte 10250

Zum Speichern einer Datei in einem directory das dem Verzeichnis der Anwendung fremd ist, lautet eingeschränkt über API 29+ . Um also eine neue Datei zu erzeugen oder eine neue Datei zu erstellen, verwenden Sie Ihr Anwendungsverzeichnis wie folgt :-

Der richtige Ansatz ist also :-

val file = File(appContext.applicationInfo.dataDir + File.separator + "anyRandomFileName/")

Sie können beliebige Daten in diese generierte Datei schreiben!

Die oben genannten file ist zugänglich und würde nicht throw any exception denn sie befindet sich in Ihrem eigenen entwickelte App's Verzeichnis.

Die andere Möglichkeit ist android:requestLegacyExternalStorage="true" en manifest application tag wie vorgeschlagen von Uriel aber es ist keine dauerhafte Lösung!

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