2013-03-29 7 views
33

Diese Zeile:eine Datei in Android zu erstellen Versuch: open fehlgeschlagen: EROFS (Read-only-Dateisystem)

final FileOutputStream outputStream = new FileOutputStream(name); 

führt zu einem FileNotFoundException mit der Meldung /2ozjfFQzwv: open failed: EROFS (Read-only file system) zu sein, wo "2ozjfFQzwv" ist, was ich bestehen als der Name der Datei

Ich habe dies mit und ohne die WRITE_INTERNAL_STORAGE Erlaubnis versucht. Wie erstelle ich diese Datei zum Schreiben?

Alternativ möchte ich nur ein Bild zu einer neuen Aktivität geben können, und es ist zu groß, um es in einem Extra zu serialisieren. Gibt es einen einfacheren Weg als in eine Datei zu schreiben und sie dann erneut zu lesen? Alle Fragen hier scheinen über das Schreiben auf eine SD-Karte zu gehen, was ich nicht tun möchte, weil viele Leute keine SD-Kartensteckplätze haben.

Antwort

65

Ich habe dies mit und ohne die Berechtigung WRITE_INTERNAL_STORAGE versucht.

Es gibt keine WRITE_INTERNAL_STORAGE Erlaubnis in Android.

Wie erstelle ich diese Datei zum Schreiben?

Sie nicht, außer vielleicht auf einem gerooteten Gerät, wenn Ihre App mit Superuser-Privilegien ausgeführt wird. Sie versuchen, in den Stamm des internen Speichers zu schreiben, auf den die Apps keinen Zugriff haben.

Verwenden Sie bitte die Version des -Konstruktors, der ein File-Objekt benötigt. Erstellen Sie, dass File Objekt basierte weg von einer Stelle, die Sie schreiben können, wie zum Beispiel:

  • getFilesDir() (genannt auf Activity oder anderen Context)
  • getExternalFilesDir() (genannt auf Activity oder anderen Context)

Letzteres erfordert WRITE_EXTERNAL_STORAGE als eine Erlaubnis.

Gibt es einen einfacheren Weg, als es in eine Datei zu schreiben und sie dann erneut zu lesen?

Sie können es vorübergehend in ein statisches Datenelement einfügen.

, weil viele Menschen SD-Kartenslots nicht

haben

"SD-Kartensteckplätze" sind irrelevant, im Großen und Ganzen. 99% der Nutzer von Android-Geräten werden externen Speicher haben - die Ausnahme sind Geräte ab 4 Jahren, bei denen der Nutzer seine SD-Karte entfernt hat. Geräte, die seit Mitte 2010 hergestellt werden, verfügen über externen Speicher als Teil des On-Board-Flash-Speichers und nicht als Wechselmedien.

+5

+1 für getFilesDir(), danke 'neue BufferedWriter (neue Filewriter (getFilesDir() + Dateiname));' –

+0

Alte Geräte? Soweit ich von der Verwendung meines Nexus 7 2013 erfahren habe, unterstützt es keine SD-Karte ... das gleiche gilt für Nexus 10, vielleicht ein anderes Nexi. – PawelP

+12

@ PawełParadowski: Alle Nexus-Geräte verfügen über externen Speicher. Sie haben keinen Wechselspeicher. Externer Speicher bedeutet nicht Wechselspeicher. – CommonsWare

3

Hier ist ein einfaches Beispiel von android developer.

Grundsätzlich können Sie eine Datei im internen Speicher wie folgt schreiben:

String FILENAME = "hello_file"; 
String string = "hello world!"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
fos.write(string.getBytes()); 
fos.close(); 
2

Wie andere erwähnt haben, App auf Android kann keine Datei in einen beliebigen Ordner der interne Speicher schreiben, aber ihre eigenen privaten Lagerhaltung (Dies ist unter/data/data/PACKAGE_NAME).

Sie sollten die API verwenden, um den richtigen Pfad für Ihre App zu erhalten.

lesen this.

13

versuchen Sie mit der Erlaubnis von WRITE_EXTERNAL_STORAGE Sie sollten das verwenden, ob es eine externe Karte gibt oder nicht.

Dies funktioniert gut für mich:

path = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname); 

und legt meine Dateien in den entsprechenden Ordner

+0

'Ab der API-Stufe 19 ist diese Berechtigung zum Lesen/Schreiben von Dateien in Ihren anwendungsspezifischen Verzeichnissen, die von getExternalFilesDir (String) und getExternalCacheDir() zurückgegeben werden, nicht erforderlich. 'https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE – user3175580

5

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

in manifest Hinzufügen und mit gleichen wie Martin:

path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname); 

Es funktionierte.

+3

Von dev.android: Wenn Ihre App jedoch die Berechtigung WRITE_EXTERNAL_STORAGE verwendet, hat sie implizit auch die Berechtigung, den externen Speicher zu lesen . – IlyaEremin

+0

@ilyaEremin - wahr genug – Martin