【问题标题】:Can't write to sdcard even with permissions set and external storage in MEDIA_MOUNTED state即使权限设置和外部存储处于 MEDIA_MOUNTED 状态,也无法写入 sdcard
【发布时间】:2012-10-15 22:25:36
【问题描述】:

在尝试将文件写入 sdcard 时,我收到 java.io.FileNotFoundException: /filename (Read-only file system) 异常。可悲的是,这里发布的许多解决方案都没有帮助我。我已设置权限,外部存储处于 MEDIA_MOUNTED 状态。 这是有问题的代码:

Log.i("STORAGE", Environment.getExternalStorageState());
OutputStream fos = new FileOutputStream(Helpers.StripExtension(filePath) + ".blk");
fos.write(digest.getBytes());
fos.close();    

filePath 来自文件代码。我要做的是从选定的文件中读取,然后保存另一个具有相同名称、不同扩展名和其中一些内容的文件。

清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mypackagename"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="15" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main"
        android:theme="@android:style/Theme.Black" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Logcat:

 10-25 18:24:34.330: I/FILEPATH(1989): /mnt/sdcard/Untitled.txt
 10-25 18:24:34.360: I/STORAGE(1989): mounted
 10-25 18:24:34.360: W/System.err(1989): java.io.FileNotFoundException: /mnt/sdcard/Untitled.blk (Read-only file system)
 10-25 18:24:34.360: W/System.err(1989):    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
 10-25 18:24:34.360: W/System.err(1989):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
 10-25 18:24:34.360: W/System.err(1989):    at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
 10-25 18:24:34.360: W/System.err(1989):    at java.io.FileOutputStream.<init>(FileOutputStream.java:165)
 10-25 18:24:34.360: W/System.err(1989):    at java.io.FileOutputStream.<init>(FileOutputStream.java:144)

我在真实设备上运行它,而不是 avd。我已经尝试重新启动我的设备并重建项目。 OfficeSuite 等应用程序可以毫无问题地写入此位置。

设备:搭载 Android 2.3.7 (CyanogenMod 7) 的 ZTE Blade

【问题讨论】:

  • 您是否尝试将其写入目录而不是 sd 卡的根目录? String withDir = Environment.getExternalStorageState() + "/someDir/" + fileName;文件文件 = 新文件(withDir);文件.mkdirs();或类似的...
  • 主要问题是:为什么您的 sdcard 被安装为只读?您使用哪种设备?哪个安卓版本?
  • 我也遇到过类似的情况,是 SD 卡坏了。事情是,有些程序可以工作,但发现在重新启动时对 sdcard 的任何更改都没有坚持,所以我假设它被接受到缓冲区中,但缓冲区永远无法刷新和写入它出来,给人一种它在那里的错觉,而实际上它并不存在
  • @WarrenFaith 有趣的是Environment.getExternalStorageState() 说它安装为 rw(根据developer.android)。我会用系统规格更新我的问题。
  • @DrakeClarris 所说的也可能是您的情况。如果可能,请更改 SD 卡。您应该检查的另一种可能性是模拟器和运行股票 android 的设备。 CM 可能很好,但我也会尝试检查其他 android rom。

标签: android io


【解决方案1】:

试试这个:

File file = new File(Helpers.StripExtension(filePath) + ".blk");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write(digest.getBytes());
fos.close();

如果这不起作用,我认为您在读取原始文件 (digest.getBytes()) 时可能会遇到问题。在此发布更多代码,我们可以从那里开始

编辑:

如果它不允许您写入所选目录,请尝试使用如下路径进行测试:

File file = new File(Environment.getExternalStorageDirectory() + "test_file.blk");

它应该可以正常工作,您可能只是没有对您正在使用的目录的写入权限。

【讨论】:

  • 按照建议更改此行会得到java.io.FileNotFoundException: /newFile/Untitled.blk (No such file or directory)。我确信从原始文件读取不是问题,因为在OutputStream fos = ... 行抛出异常,还将digest.getBytes() 更改为某个字符串,不会改变任何内容。
  • 您是否尝试过答案中的第二种解决方案?显式创建文件,然后写入文件可能会提供更清晰的问题。
  • 第二种解决方案在file.createNewFile(); 行给出java.io.IOException: Read-only file system
  • 那么您正在写入设备无权写入的目录。 “Untitled.blk”之前的目录路径是什么?请参阅我刚刚对我的答案所做的编辑
  • /mnt/sdcard GetExternalStorageDirectory() 给 /mnt/sdcard 我很确定我之前从我的应用程序中将一些文件保存到了 sdcard 根目录。但现在我有例外。
【解决方案2】:

试试这个:

File file = new File(filePath);
File parent = file.getParentFile();
if (!parent.exists() && !parent.mkdirs()) {
      return;
}

file = new File(Helpers.StripExtension(filePath) + ".blk");
OutputStream fos = new FileOutputStream(file);
fos.write(digest.getBytes());
fos.close();

【讨论】:

  • OutputStream fos = new FileOutputStream(file); 行提供“W/System.err(5180): java.io.FileNotFoundException: /foobar.blk (只读文件系统)”
【解决方案3】:

太好了,我前段时间也遇到过同样的问题。缺少路径分隔符(或其他名称)。

File file = new File(Environment.getExternalStorageDirectory() + "test_file.blk");

没用,但是

File file = new File(Environment.getExternalStorageDirectory() + "/test_file.blk");

表现不错

还有:

FileWriter f = new FileWriter(Environment.getExternalStorageDirectory().getPath()+ "/foobar");
f.append("stuff");
f.close();

工作正常等
我认为异常说它是只读的,因为根文件系统确实是只读的。

注意:
java.io.FileNotFoundException: /foobar (Read-only file system) 表示我们正在写入系统根目录
java.io.FileNotFoundException: /mnt/sdcard/foobar (Read-only file system) 表示 sdcard 根目录(我没有收到此异常,这只是一个示例)

tl;dr 路径错误

【讨论】:

  • 奇怪,我可以毫无问题地写入 sdcard root。实际上,出于安全原因,不允许执行 sdcard 上的文件,但您可以写入,否则您无法在其上创建文件夹。但是,如果您自己的解决方案有效,您应该将自己的答案标记为正确。 :)
  • 澄清一下:我试图(错误地)写入系统根目录,而不是 sdcard 根目录 :) 顺便说一句,在将我的答案标记为接受之前有 2 天的冷却时间。
猜你喜欢
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多