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.
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 suActivity
u otroContext
) -
getExternalFilesDir()
(llamado a suActivity
u otroContext
)
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.
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
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ó.
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();
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 .
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:
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