Intentando crear un archivo en Android: abrir fallido: EROFS (sistema de archivos de solo lectura)

Esta línea:

final FileOutputStream outputStream = new FileOutputStream(name); 

da como resultado una FileNotFoundException con el mensaje /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 permiso WRITE_INTERNAL_STORAGE . ¿Cómo creo este archivo para escribir?

Alternativamente, solo quiero poder dar una imagen a una nueva actividad, y es demasiado grande para serializarlo en un extra. ¿Hay alguna manera más fácil que escribirlo en un archivo y luego volver a leerlo? Todas las preguntas aquí parecen ser sobre escribir en una tarjeta SD, lo que no quiero hacer porque muchas personas no tienen ranuras para tarjetas SD.

He intentado esto con y sin el permiso WRITE_INTERNAL_STORAGE.

No hay permiso WRITE_INTERNAL_STORAGE en Android.

¿Cómo creo 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 qué aplicaciones no tiene acceso.

Utilice la versión del constructor FileOutputStream que toma un objeto File . Cree ese objeto de File partir de alguna ubicación en la que pueda escribir, como por ejemplo:

  • getFilesDir() (llamado en tu Activity u otro Context )
  • getExternalFilesDir() (llamado en tu Activity u otro Context )

Este último requerirá WRITE_EXTERNAL_STORAGE como un permiso.

¿Hay alguna manera más fácil que escribirlo en un archivo y luego volver a leerlo?

Puede colocarlo temporalmente en un miembro de datos estáticos.

porque muchas personas no tienen ranuras para tarjetas SD

Las “ranuras para tarjetas SD” son irrelevantes, en general. El 99% de los usuarios de dispositivos con Android tendrá almacenamiento externo; la excepción serán los dispositivos con más de 4 años en los que el usuario haya eliminado su tarjeta SD. Los dispositivos fabricados desde mediados de 2010 tienen almacenamiento externo como parte de flash incorporado, no como medio extraíble.

intente utilizar el permiso de WRITE_EXTERNAL_STORAGE. Debe usar eso si hay una tarjeta externa o no.

Esto funciona bien para mi:

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

y coloca mis archivos en la carpeta apropiada

Añadiendo

    

en manifiesto y usando lo mismo que Martin:

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

Funcionó.

Aquí hay una muestra simple del desarrollador de Android .

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(); 

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

Debes usar la API para obtener la ruta correcta que está permitida para tu aplicación.

lee esto

Google tiene acceso de escritura restringido a la tarjeta SD externa. Desde API 19 hay un marco llamado Storage Access Framework que le permite configurar los “contratos” para permitir el acceso de escritura.

Para más información:

Android: cómo utilizar el nuevo Storage Access Framework para copiar archivos en una tarjeta sd externa