61

这一行:

final FileOutputStream outputStream = new FileOutputStream(name);

结果是一条FileNotFoundException消息,/2ozjfFQzwv: open failed: EROFS (Read-only file system)其中“2ozjfFQzwv”是我作为文件名传递的。

我在有和没有WRITE_INTERNAL_STORAGE许可的情况下都试过这个。如何创建此文件以进行写入?

或者,我只是希望能够为新活动提供图像,并且它太大而无法将其序列化。有没有比将其写入文件然后再次读取更简单的方法?这里的所有问题似乎都是关于写入 SD 卡的,我不想这样做,因为很多人没有 SD 卡插槽。

4

8 回答 8

93

我在有和没有 WRITE_INTERNAL_STORAGE 许可的情况下都试过这个。

Android中没有WRITE_INTERNAL_STORAGE权限。

如何创建此文件以进行写入?

如果您的应用程序以超级用户权限运行,则您不需要,除非在有根设备上。您正在尝试写入应用程序无权访问的内部存储的根目录。

请使用接受对象的FileOutputStream构造函数版本。File根据您可以写入的某个位置创建该File对象,例如:

  • getFilesDir()(打电话给你Activity或其他人Context
  • getExternalFilesDir()(打电话给你Activity或其他人Context

后者将需要WRITE_EXTERNAL_STORAGE作为许可。

有没有比将其写入文件然后再次读取更简单的方法?

你可以暂时把它放在一个静态数据成员中。

因为很多人没有SD卡槽

总的来说,“SD 卡插槽”是无关紧要的。99% 的 Android 设备用户将拥有外部存储设备——用户移除 SD 卡的 4 年以上设备除外。自 2010 年中以来制造的设备将外部存储作为板载闪存的一部分,而不是作为可移动媒体。

于 2013-03-29T20:54:53.020 回答
17

尝试使用 WRITE_EXTERNAL_STORAGE 的权限,无论是否有外部卡,您都应该使用该权限。

这对我很有效:

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

并将我的文件放在适当的文件夹中

于 2013-03-29T21:40:25.040 回答
6

这是来自android developer的简单示例。

基本上,您可以像这样在内部存储中写入文件:

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

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
于 2013-03-29T20:58:30.297 回答
6

添加

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

有效。

于 2014-04-22T21:04:49.807 回答
3

正如其他人所提到的,Android 上的应用程序无法将文件写入内部存储的任何文件夹,但他们自己的私有存储(位于 /data/data/PACKAGE_NAME 下)。

您应该使用 API 来获取您的应用程序允许的正确路径。

这个

于 2013-03-29T21:18:01.460 回答
1

要为应用程序使用内部存储,您不需要权限,但您可能需要使用:File directory = getApplication().getCacheDir();来获取应用程序允许的目录。

或者:
getCashDir();<-- 应该可以工作
context.getCashDir();(如果在广播接收器中)
getDataDir();<--Api 24

于 2019-09-13T14:39:29.217 回答
0

谷歌限制了对外部 sdcard 的写入权限。从 API 19 开始,有一个称为存储访问框架的框架,它允许您设置“合同”以允许写入访问。

欲了解更多信息:

Android - 如何使用新的存储访问框架将文件复制到外部 sd 卡

于 2017-03-27T14:51:29.670 回答
0

如果有人在单元/仪器测试中得到这个,请确保您调用getFilesDir()应用程序上下文,而不是测试上下文。即使用:

Context appContext = getInstrumentation().getTargetContext().getApplicationContext();

不是

Context appContext = InstrumentationRegistry.getContext;
于 2019-03-04T13:10:30.720 回答