这一行:
final FileOutputStream outputStream = new FileOutputStream(name);
导致FileNotFoundException
,消息为/2ozjfFQzwv: open failed: EROFS (Read-only file system)
,其中“2ozjfFQzwv”是我传递的文件名。
无论是否有WRITE_INTERNAL_STORAGE
许可,我都试过这个。如何创建此文件进行编写?
或者,我只是希望能够为新活动提供图像,并且它太大而无法将其序列化。有没有比将其写入文件然后再次从中读取更简单的方法?这里的所有问题似乎都是关于写入SD卡,我不想这样做,因为很多人没有SD卡插槽。
我在使用和不使用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年中期开始生产的设备将外部存储作为板载闪存的一部分,而不是可移动介质。
尝试使用WRITE_EXTERNAL_STORAGE的许可你应该使用它是否有外部卡。
这适合我:
path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MOVIES);
File file = new File(path, "/" + fname);
并将我的文件放在适当的文件夹中
添加
<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);
有效。
这是来自android developer的简单样本。
基本上,您可以在内部存储中写入一个文件,如下所示:
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
正如其他人所提到的,Android上的应用程序无法将文件写入内部存储的任何文件夹,而是自己的私有存储(位于/ data / data / PACKAGE_NAME下)。
您应该使用API来获取应用程序允许的正确路径。
读this。
Google限制了对外部SD卡的写入权限。从API 19开始,有一个名为Storage Access Framework的框架,它允许您设置“合同”以允许写访问。
有关详细信息:
Android - How to use new Storage Access Framework to copy files to external sd card
如果有人在单元/仪器测试中得到这个,请确保在应用程序上下文中调用getFilesDir()
,而不是测试上下文。即使用:
Context appContext = getInstrumentation().getTargetContext().getApplicationContext();
不
Context appContext = InstrumentationRegistry.getContext;