Intentando crear un archivo en Android: open failed: EROFS (sistema de archivos de solo lectura)


Esta línea:

final FileOutputStream outputStream = new FileOutputStream(name);

Resulta en un FileNotFoundException con el mensaje siendo /2ozjfFQzwv: open failed: EROFS (Read-only file system) donde "2ozjfFQzwv" es lo que pasé como el nombre del archivo.

He intentado esto con y sin el WRITE_INTERNAL_STORAGE permiso. ¿Cómo puedo crear este archivo para escribir?

Alternativamente, yo sólo quiero ser capaz de dar una imagen a una nueva actividad, y es demasiado grande para serializar un extra. ¿Hay una manera más fácil que escribirlo en un archivo y luego leerlo de nuevo? Todas las preguntas aquí parecen se trata de escribir en una tarjeta SD, que no quiero hacer porque muchas personas no tienen ranuras para tarjetas SD.

Author: Jonik, 2013-03-30

6 answers

He intentado esto con y sin el permiso WRITE_INTERNAL_STORAGE.

No hay ningún permiso WRITE_INTERNAL_STORAGE en Android.

¿Cómo puedo crear este archivo para escribir?

No lo hace, excepto quizás en un dispositivo rooteado, si su aplicación se está ejecutando con privilegios de superusuario. Está intentando escribir en la raíz del almacenamiento interno, a la que las aplicaciones no tienen acceso.

Por favor, utilice la versión del constructor FileOutputStream que toma un File objeto. Cree ese objeto File basado en alguna ubicación en la que pueda escribir, como:

  • getFilesDir() (llamado a su Activity u otro Context)
  • getExternalFilesDir() (llamado a su Activity u otro Context)

Este último requerirá WRITE_EXTERNAL_STORAGE como permiso.

¿Hay una manera más fácil que escribirlo en un archivo y luego leerlo de nuevo?

Puede ponerlo temporalmente en un miembro de datos estático.

Porque muchos la gente no tiene ranuras para tarjetas SD

Las"ranuras para tarjetas SD" son irrelevantes, en general. 99% de los usuarios de dispositivos Android tendrán almacenamiento externo - la excepción será 4 + años de edad dispositivos donde el usuario retiró su tarjeta SD. Los dispositivos fabricados desde mediados de 2010 tienen almacenamiento externo como parte del flash a bordo, no como medios extraíbles.

 76
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-18 09:39:00

Intente usar el permiso de WRITE_EXTERNAL_STORAGE Usted debe utilizar que si hay una tarjeta externa o no.

Esto funciona bien para mí:

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

Y coloca mis archivos en la carpeta apropiada

 14
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-29 21:40:25

Añadiendo

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

En manifest y usando lo mismo que Martin:

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

Funcionó.

 5
Author: nobjta_9x_tq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-12 10:56:18

Aquí hay una muestra simple de android developer.

Básicamente, puede escribir un archivo en el almacenamiento interno de esta manera:

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

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
 4
Author: Xuan Wu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-18 09:40:10

Como otros han mencionado, la aplicación en Android no puede escribir un archivo en ninguna carpeta del almacenamiento interno, sino en su propio almacenamiento privado (que se encuentra en /data/data/PACKAGE_NAME ).

Debe usar la API para obtener la ruta correcta que está permitida para su aplicación.

Léase esto .

 2
Author: android developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-29 21:18:01

Google ha restringido el acceso de escritura a la tarjeta SD externa. Desde API 19 hay un framework llamado Storage Access Framework que le permite configurar "contratos" para permitir el acceso de escritura.

Para más información:

Android-Cómo utilizar el nuevo Marco de acceso de almacenamiento para copiar archivos a una tarjeta sd externa

 0
Author: Theo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:23