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

421voto

Uriel Frankel Punkte 13282

Google hat eine neue Funktion auf Android Q : gefilterte Ansicht für externen Speicher. A Schnelllösung Dazu muss dieser Code in die Datei AndroidManifest.xml eingefügt werden:

<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android Q. -->
    <application android:requestLegacyExternalStorage="true" ... >
     ...
    </application>
</manifest>

Mehr darüber können Sie hier lesen: https://developer.Android.com/training/data-storage/use-cases

Edita: Ich fange an, Downvotes zu bekommen, weil diese Antwort für Android 11 veraltet ist. Also, wer diese Antwort sieht, gehen Sie bitte auf den Link oben und lesen Sie die Anweisungen.

371voto

Justin Fiedler Punkte 6216

Für API 23+ müssen Sie die Lese-/Schreibberechtigungen anfordern, auch wenn sie bereits in Ihrem Manifest enthalten sind.

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

AndroidManifest.xml

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

Die offizielle Dokumentation zur Beantragung von Berechtigungen für API 23+ finden Sie unter https://developer.Android.com/training/permissions/requesting.html

253voto

user462990 Punkte 5328

Ich hatte das gleiche Problem... Die <uses-permission war an der falschen Stelle. Das ist richtig:

 <manifest>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        ...
        <application>
            ...
            <activity> 
                ...
            </activity>
        </application>
    </manifest> 

En uses-permission Tag muss sich außerhalb der application Tag.

76voto

rhaldar Punkte 1055

Añadir Android:requestLegacyExternalStorage="true" zum Android-Manifest Es hat mit Android 10 (Q) bei SDK 29+ funktioniert
oder Nach der Migration Android X .

 <application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon=""
    android:label=""
    android:largeHeap="true"
    android:supportsRtl=""
    android:theme=""
    android:requestLegacyExternalStorage="true">

61voto

Audrius Meškauskas Punkte 19811

Ich habe dies einmal beobachtet, als ich die Anwendung im Emulator ausgeführt habe. In den Emulatoreinstellungen müssen Sie die Größe des externen Speichers ("SD Card") richtig angeben. Standardmäßig ist das Feld "Externer Speicher" leer, und das bedeutet wahrscheinlich, dass es kein solches Gerät gibt und EACCES ausgelöst wird, selbst wenn im Manifest Berechtigungen erteilt werden.

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