it-swarm.com.ru

Попытка создать файл в Android: открыть не удалось: EROFS (файловая система только для чтения)

Эта строка:

final FileOutputStream outputStream = new FileOutputStream(name);

в результате получается FileNotFoundException с сообщением /2ozjfFQzwv: open failed: EROFS (Read-only file system), где «2ozjfFQzwv» - это то, что я передал как имя файла.

Я пробовал это с и без разрешения WRITE_INTERNAL_STORAGE. Как мне создать этот файл для записи?

В качестве альтернативы, я просто хочу иметь возможность дать изображение новому действию, и оно слишком велико, чтобы сериализовать его дополнительно. Есть ли более простой способ, чем записать его в файл и снова прочитать из него? Все вопросы здесь, похоже, касаются записи на SD-карту, но я не хочу этого делать, потому что у многих людей нет слотов для SD-карт.

41
Drew

Я пробовал это с и без разрешения WRITE_INTERNAL_STORAGE.

В Android нет разрешения WRITE_INTERNAL_STORAGE.

Как мне создать этот файл для записи?

Если вы используете приложение с привилегиями суперпользователя, вы можете этого не делать, за исключением, возможно, на рутированном устройстве. Вы пытаетесь записать в корень внутреннего хранилища, к которому приложения не имеют доступа.

Пожалуйста, используйте версию конструктора FileOutputStream, которая принимает объект File. Создайте этот объект File на основе некоторого местоположения, в которое вы можете записать, например:

  • getFilesDir() (вызывается на Activity или другую Context)
  • getExternalFilesDir() (вызывается на Activity или другую Context)

Последний будет требовать WRITE_EXTERNAL_STORAGE в качестве разрешения.

Есть ли более простой способ, чем записать его в файл и снова прочитать из него?

Вы можете временно поместить его в статический член данных.

потому что многие люди не имеют слотов для SD-карт

«Слоты для SD-карт» не имеют значения, по большому счету. 99% пользователей устройств Android будут иметь внешнее хранилище - исключение составляют устройства старше 4 лет, где пользователь удалил свою SD-карту. Устройства, выпускаемые с середины 2010 года, имеют внешнее хранилище как часть встроенной флэш-памяти, а не как съемный носитель.

78
CommonsWare

попробуйте использовать разрешение WRITE_EXTERNAL_STORAGE Вы должны использовать это независимо от того, есть ли внешняя карта или нет.

Это хорошо работает для меня:

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

и помещает мои файлы в соответствующую папку

14
Martin

Вот простой пример от разработчика Android .

По сути, вы можете записать файл во внутреннюю память следующим образом:

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

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

Добавление 

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

в манифесте и использовании так же, как Мартин:

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

Это сработало.

5
nobjta_9x_tq

Как уже упоминали другие, приложение на Android не может записать файл в какую-либо папку во внутреннем хранилище, кроме собственного частного хранилища (которое находится в/data/data/PACKAGE_NAME).

Вы должны использовать API, чтобы получить правильный путь, разрешенный для вашего приложения.

прочитайте это .

2
android developer

Google ограничил доступ на запись к внешней SD-карте. Из API 19 существует платформа, называемая Storage Access Framework, которая позволяет вам устанавливать «контракты», чтобы разрешить доступ для записи.

Для дальнейшей информации:

Android - Как использовать новую среду Storage Access Framework для копирования файлов на внешнюю SD-карту

0
Theo