Подтвердить что ты не робот

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

Эта строка:

final FileOutputStream outputStream = new FileOutputStream(name);

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

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

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

4b9b3361

Ответ 1

Я пробовал это с разрешением 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 года, имеют внешнее хранилище как часть встроенной вспышки, а не как съемные носители.

Ответ 2

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

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

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

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

Ответ 3

Добавление

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

в манифесте и используя то же, что и Martin:

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

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

Ответ 4

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

В принципе, вы можете записать файл во внутреннем хранилище, например:

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

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

Ответ 5

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

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

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

Ответ 6

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

Для получения дополнительной информации:

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