android - 只读文件系统

标签 android image file permissions png

我正在尝试将 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 消息:

Error accessing file: open failed: EROFS (Read-only file system)

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

谢谢!

最佳答案

编辑:因为 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" 写入您的 SD 卡的根目录,以某种方式污染后者。该文件将保留在那里,直到您手动将其删除,并且您手机上安装的所有应用程序都可以访问该文件。在您的电脑上安装 SD 卡或使用文件浏览器也可以访问它。

这些行:

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

将文件写入内部存储的应用私有(private)空间(/data/data/you.app.name)。由于它是私有(private)的,因此只有您的应用才能访问它。唯一的异常(exception)是您的手机已获得 root 权限。

要检索它,您必须使用:

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

关于android - 只读文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17858975/

相关文章:

java - 如何使用 HTML 标签将以字节为单位的图像显示到 JSP 页面?

android - Android 的“全屏”菜单

java - 使用 alpha 渐变将位图绘制到 Canvas

php - SQL 将所有 .JPG 设置为 .PNG

Java 文件 - 打开一个文件并写入

bash - 这可以更快地完成吗(读取文件,替换 [sed],写入新文件)

java - 创建只读文件

php - Phonegap Android上传到远程数据库失败

java - 如何从另一个类调用 Activity 方法?

html - 在悬停时更改图像和文本并单击