öffnen, ist fehlgeschlagen : EACCES ( Zugriff verweigert )

? user3613696 @ | Original: StackOverFlow
---

Ich habe ein sehr sonderbares Problem mit Speicher Zugriff auf einigen Geräten . Die App funktioniert auf meinem Testgeräte ( Nexus 4 & amp; 7, Samsung GS5 ) . Alle meine Geräte mit Android 4.4.2 . Aber ich erhielt viele E-Mails von Nutzern von selbst, dass die App nicht auf die Speicher (weder im internen Speicher noch die SD-Karte ) zu schreiben. Von von Nutzer-Feedback erhielt der Log-Datei, kann ich sehen, das Problem ist, den folgenden Code :

try {
    if (fStream == null) {
    fStream = new FileOutputStream(filename, true);
}
    fStream.write(data, 0, bytes);
    return;
} catch (IOException ex) {
    ex.printStackTrace();
}

Es löst eine Ausnahme bei der Linie fstream = new Fileoutputstream (filename, true); bei der Erstellung von Fileoutputstream .

Der Stapel Protokoll :

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

Im AndroidManifest.xml Ich habe die folgenden Berechtigungen fest:

 <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 mit der richtigen App Private auf der SD-Karte. Und was mehr ist seltsam ist, dass es nicht im internen Speicher als auch schreiben. Wie kann das passieren, wenn ich beide lesen & amp; Schreibrechte ? Die Nutzer sagen, dass sie nicht den Anschluss ihrer Geräte an den PC zu diesem Zeitpunkt .

Update

Es stellt sich heraus rufe ich öffnen und schließen Fileoutputstream zu häufig, was die FileNotFoundException irgendwann wirft . Klingt eher wie ein Threading-Problem .

---

Top 5 Antwort

1Garret @

Ich lief in ein ähnliches Problem eine Weile zurück.

Ihr Problem könnte in zwei unterschiedlichen Gebieten. Es ist entweder, wie Sie die Erstellung sind die Datei zu schreiben, oder Ihre Methode des Schreibens könnte fehlerhaft, dass es Telefon angewiesen werden.

Wenn Sie das Schreiben der Datei zu einer bestimmten Stelle auf der SD-Karte, versuchen Sie es mit Umgebungsvariablen . Sie sollten immer auf einen gültigen Speicherort . Hier ist ein Beispiel, um zu dem Ordner downloads schreiben:

java.io.File xmlFile = new java.io.File(Environment
    .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
     + "/Filename.xml");

Wenn Sie das Schreiben der Datei im internen Speicher der Anwendung. Versuchen Sie dieses Beispiel:

java.io.File xmlFile = new java.io.File((getActivity()
   .getApplicationContext().getFileStreamPath("FileName.xml")
   .getPath()));

Persönlich setze ich auf externen Bibliotheken, um die Streaming- Datei, um zu behandeln. Das hat mich nicht gescheitert ist leer.

org.apache.commons.io.FileUtils.copyInputStreamToFile(is, file);

Ich habe Daten einmal zu oft auf einem missglückten Schreibbefehlverloren, so dass ich mich auf bekannten und getesteten Bibliotheken für meine IO schweres Heben .

Noch eine Anmerkung, wenn die Dateien groß sind, können auch Sie in der Ausführung des IO im Hintergrund suchen, oder benutzen Sie Callbacks .

2ninad.sonje @

Ich habe auch vor dem gleichen Problem . Nach viel harter Arbeit, fand ich, was falsch in meinem Fall war . Mein Gerät mittels USB-Kabel an den Computer angeschlossen . Es gibt Arten von USB -Verbindungen wie Massenspeicher, Media-Player (MTP), Kamera (PTP) usw. Ich arbeite mit war - " Mass Storage ", und das war die Probleme verursacht . Als ich den Verbindungstyp geändert haben, wurde die Frage gelöst.

Denken Sie immer daran beim Zugriff auf Dateisystem auf Android-Gerät : -

NICHT als Massenspeicher an den Computer anschließen / St.