Ich habe ein sehr seltsames Problem mit dem Speicherzugriff auf einigen Geräten. Die App funktioniert auf meinen Testgeräten (Nexus 4 & 7, Samsung GS5). Alle meine Geräte mit Android 4.4.2. Aber ich habe viele E-Mails von Benutzern erhalten, die besagten, dass die App nicht in den Speicher schreiben kann (weder in den internen Speicher noch in die SD-Karte). Aus der Protokolldatei, die vom Benutzerfeedback erhalten wurde, geht hervor, dass das Problem der folgende Code ist:
try {
if (fStream == null) {
fStream = new FileOutputStream(filename, true);
}
fStream.write(data, 0, bytes);
return;
} catch (IOException ex) {
ex.printStackTrace();
}
Es wird eine Ausnahme in der Zeile fStream = new FileOutputStream (Dateiname, true) ausgelöst. beim Erstellen von FileOutputStream.
Das Stapelprotokoll lautet:
W/System.err( 8147): Caused by: java.io.FileNotFoundException: /storage/emulated/0/my_folder/test_file_name.png: open failed: EACCES (Permission denied)
w/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:409)
W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err( 8147): at myapp.save(SourceFile:515)
W/System.err( 8147): ... 8 more
W/System.err( 8147): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
W/System.err( 8147): at libcore.io.Posix.open(Native Method)
W/System.err( 8147): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:393)
W/System.err( 8147): ... 11 more
In der AndroidManifest.xml habe ich folgende Berechtigungen deklariert:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Ich habe bestätigt, dass die Benutzer die private App der richtigen App auf der SD-Karte verwenden. Und was noch seltsamer ist, dass es nicht auch in den internen Speicher schreibt. Wie kann dies passieren, wenn ich sowohl Lese- als auch Schreibberechtigungen habe? Die Benutzer geben an, dass sie ihre Geräte zu diesem Zeitpunkt nicht an den PC anschließen.
Aktualisieren
Es stellt sich heraus, dass ich FileOutputStream zu häufig zum Öffnen und Schließen aufrufe, wodurch irgendwann die FileNotFoundException ausgelöst wird. Klingt eher nach einem Threading-Problem.