Попытка создать файл в 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-карт.
Ответы
Ответ 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-карту