【问题标题】:Read-only file system只读文件系统
【发布时间】:2013-07-25 13:09:17
【问题描述】:

我正在尝试将 png 文件存储在手机的内存中,但遇到了一些困难。

我正在使用此代码:

private void storeImage(Bitmap image, String nombre) {
    try {
        File file = new File(name + ".png");
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        image.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }  
}

但它失败并显示此 LogCat 消息:

访问文件时出错:打开失败:EROFS(只读文件系统)

我不知道如何更改文件的权限,或者是否有更好的方法将 png 文件存储在手机中。

谢谢!

【问题讨论】:

  • 你必须添加权限

标签: android image file permissions png


【解决方案1】:

编辑:由于 kitkat 不鼓励使用 Environment.getExternalStorageDirectory();,而支持 Context.getExternalFilesDir 它返回主共享/外部存储设备上目录的绝对路径,应用程序可以在其中放置它拥有的持久文件。这些文件在应用程序内部,并且通常不作为媒体对用户可见。该目录及其内容将在应用卸载后被删除,您将没有WRITE_EXTERNAL_STORAGE使用返回目录的使用权限。

您的代码正试图在/ 中写入,它是只读的。如果要将位图存储在 SD 卡中,则必须进行更改:

File file = new File(nombre+".png");

进入:

File root = Environment.getExternalStorageDirectory();
File file = new File(root, nombre+".png");

这两行将尝试将nombre+".png" 写入您的 sdcard 的根目录,以某种方式污染后者。该文件将保留在那里,直到您手动将其删除,并且手机上安装的所有应用程序都可以访问该文件。在您的电脑上安装 SD 卡或使用文件浏览器也可以访问它。

这些行:

final FileOutputStream fos = openFileOutput(nombre+".png", Context.MODE_PRIVATE);
image.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();

将文件写入内部存储(/data/data/you.app.name)的应用程序私有空间。由于它是私有的,因此只有您的应用程序才能访问它。唯一的例外是,如果您有一部已植根的手机。

要检索它,您必须使用:

final FileInputStream fis = openFileOutput(nombre+".png", Context.MODE_PRIVATE);

【讨论】:

  • 好的,谢谢!!但是我真的不想将文件存储在根目录中,也不想将其存储在 externalSD 中,我想将其存储在内部存储器中,在我的应用程序存储空间中,在 /data/数据/包/文件/。有可能吗?
  • 好吧!!我可以创建文件!谢谢!
  • 如果您澄清了您给出的外部示例和内部示例之间的区别,这将是一个很好的答案,但是您以一种非常令人困惑的方式将它们两者一起运行。
  • @ChrisStratton 感谢您的反馈。我更新了答案
猜你喜欢
  • 2012-03-11
  • 1970-01-01
  • 2018-04-10
  • 2012-06-03
  • 2020-04-26
  • 2016-08-04
  • 2020-07-01
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多