it-swarm.com.de

Versuch, eine Datei in Android zu erstellen: Öffnen fehlgeschlagen: EROFS (schreibgeschütztes Dateisystem)

Diese Linie:

final FileOutputStream outputStream = new FileOutputStream(name);

führt zu einer FileNotFoundException mit der Nachricht /2ozjfFQzwv: open failed: EROFS (Read-only file system), wobei "2ozjfFQzwv" das ist, was ich als Dateiname übergeben habe.

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

Alternativ möchte ich nur in der Lage sein, ein Bild einer neuen Aktivität zu geben, und es ist zu groß, um es in einem Zusatz zu serialisieren. Gibt es eine einfachere Möglichkeit, als in eine Datei zu schreiben und sie dann erneut zu lesen? Bei allen Fragen hier scheint es sich um das Schreiben auf eine SD-Karte zu handeln, was ich nicht tun möchte, da viele Leute keine SD-Kartensteckplätze haben.

41
Drew

Ich habe dies mit und ohne die Berechtigung WRITE_INTERNAL_STORAGE versucht.

In Android ist keine WRITE_INTERNAL_STORAGE-Berechtigung vorhanden.

Wie erstelle ich diese Datei zum Schreiben?

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

Bitte verwenden Sie die Version des FileOutputStream-Konstruktors, der ein File-Objekt akzeptiert. Erstellen Sie dieses File-Objekt an einem Ort, an dem Sie schreiben können, z.

  • getFilesDir() (wird von Ihrer Activity oder einer anderen Context aufgerufen)
  • getExternalFilesDir() (wird von Ihrer Activity oder einer anderen Context aufgerufen)

Letzteres erfordert WRITE_EXTERNAL_STORAGE als Erlaubnis.

Gibt es eine einfachere Möglichkeit, als in eine Datei zu schreiben und sie dann erneut zu lesen?

Sie können es vorübergehend in einem statischen Datenelement ablegen.

weil viele Leute keine SD-Kartensteckplätze haben

"SD-Kartensteckplätze" sind im Großen und Ganzen irrelevant. 99% der Benutzer von Android-Geräten verfügen über einen externen Speicher. Die Ausnahme sind Geräte ab 4 Jahren, bei denen der Benutzer seine SD-Karte entfernt hat. Geräte, die seit Mitte 2010 hergestellt werden, verfügen über einen externen Speicher als Bestandteil des integrierten Flash-Speichers und nicht als Wechseldatenträger.

78
CommonsWare

versuchen Sie es mit der Erlaubnis von WRITE_EXTERNAL_STORAGE Sie sollten dies verwenden, unabhängig davon, ob eine externe Karte vorhanden ist oder nicht.

Das funktioniert gut für mich:

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

und legt meine Dateien im entsprechenden Ordner ab

14
Martin

Hier ist ein einfaches Beispiel von Android-Entwickler .

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

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

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

Hinzufügen 

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

im Manifest und unter Verwendung von Martin:

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

Es funktionierte.

5
nobjta_9x_tq

Wie bereits erwähnt, kann die App auf Android keine Dateien in einen Ordner des internen Speichers schreiben, sondern in ihren privaten Speicher (unter/data/data/PACKAGE_NAME).

Sie sollten die API verwenden, um den korrekten Pfad zu erhalten, der für Ihre App zulässig ist.

lese this .

2

Wenn dies beim Testen von Einheiten/Instrumenten auftritt, stellen Sie sicher, dass Sie getFilesDir() im App-Kontext aufrufen, nicht im Testkontext. d.h. Verwendung:

Context appContext = getInstrumentation().getTargetContext().getApplicationContext();

nicht

Context appContext = InstrumentationRegistry.getContext;
0
David Refaeli

Google hat den Schreibzugriff auf die externe SD-Karte eingeschränkt. Ab API 19 gibt es ein Framework namens Storage Access Framework, mit dem Sie "Verträge" einrichten können, um den Schreibzugriff zu ermöglichen.

Für weitere Infos:

Android - Verwendung des neuen Storage Access Framework zum Kopieren von Dateien auf eine externe SD-Karte

0
Theo