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

53voto

john Punkte 1282

Zusätzlich zu all diesen Antworten sollten Sie sicherstellen, dass Sie Ihr Telefon nicht als USB-Speicher verwenden.

Ich hatte das gleiche Problem auf dem HTC Sensation bei aktiviertem USB-Speichermodus. Ich kann die App immer noch debuggen/ausführen, aber ich kann nicht auf dem externen Speicher speichern.

35voto

omzer Punkte 781

Seien Sie sich bewusst, dass die Lösung:

<application ...
    android:requestLegacyExternalStorage="true" ... >

ist vorübergehend, früher oder später sollte Ihre Anwendung auf die Verwendung von Scoped Storage .

Unter Android 10 können Sie die vorgeschlagene Lösung verwenden, um die Systembeschränkungen zu umgehen, aber unter Android 11 (R) it is mandatory to use scoped storage und Ihre Anwendung könnte kaputt gehen, wenn Sie weiterhin die alte Logik verwenden!

Dieses Video könnte eine gute Hilfe sein.

34voto

Piroxiljin Punkte 551

Mein Problem war mit "TargetApi(23)", die erforderlich ist, wenn Ihre minSdkVersion unter 23 ist.

Ich habe also die Erlaubnis mit folgendem Ausschnitt beantragt

protected boolean shouldAskPermissions() {
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}

@TargetApi(23)
protected void askPermissions() {
    String[] permissions = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"
    };
    int requestCode = 200;
    requestPermissions(permissions, requestCode);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// ...
    if (shouldAskPermissions()) {
        askPermissions();
    }
}

29voto

jacoballenwood Punkte 2395

Android 10 (API 29) führt Scoped Storage ein . Eine Änderung des Manifests zur Anforderung von Altspeichern ist keine langfristige Lösung.

Ich habe das Problem behoben, als ich meine früheren Instanzen von Environment.getExternalStorageDirectory() (die mit API 29 veraltet ist) mit context.getExternalFilesDir(null) .

Beachten Sie, dass context.getExternalFilesDir(type) kann null zurückgeben, wenn der Speicherort nicht verfügbar ist. Überprüfen Sie also immer, ob Sie über externe Berechtigungen verfügen.

Mehr lesen aquí .

20voto

Atul Kaushik Punkte 5114

Ich mache die gleiche Erfahrung. Ich habe herausgefunden, dass, wenn Sie zu Einstellungen -> Anwendungsmanager -> Ihre Anwendung -> Berechtigungen -> Speicherung aktivieren ist das Problem gelöst.

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