模拟器写入时的Android SD卡失败,IOException EROFS(只读文件系统),具有正确的权限

时间:2012-11-12 01:08:01

标签: java android android-emulator sd-card

我的Android应用程序无法将文件写入AVD的SD卡,这是代码:

    File root = Environment.getExternalStorageDirectory();

    Log.w("sdcard", "root.canWrite() = " + root.canWrite());

    try {           
        File myFile = new File(root + File.pathSeparator + "mysdfile.txt");
        myFile.createNewFile();
        FileOutputStream fOut = new FileOutputStream(myFile);
        OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
        myOutWriter.append("testing testing 123");
        myOutWriter.close();
        fOut.close();
    } catch (IOException e) {
        Log.w("ExternalStorage", "Error writing", e);
    }

root.canWrite()返回true,然后引发此异常:

java.io.IOException: open failed: EROFS (Read-only file system)

清单文件具有WRITE_EXTERNAL_STORAGE权限(清单的直接子代):

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

我还尝试使用以下方法重新安装AVD外壳中的SD卡:

mount -o remount rw /mnt/sdcard

......但无济于事。 AVD还具有“SD卡支持”标志设置。不知道该怎么做,有什么想法吗?

4 个答案:

答案 0 :(得分:5)

从Honeycomb开始,Android设备默认不允许第三方应用程序写入外部可移动存储。您可以通过启动adb shell来检查这一点,转到/system/etc/permissions/platform.xml,然后查找以下行:

<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
    <group gid="sdcard_rw" />
</permission>

第三方应用不属于“sdcard_rw”群组,而是“media_rw”的一部分。 如果您的手机已植根(您的模拟器应该是root),则可以修改platform.xml文件以添加具有此权限的另一个组。它应该是这样的:

<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
    <group gid="sdcard_rw" />
    <group gid="media_rw" />
</permission>

一些制造商(我知道三星确实如此)手机上仍然有自己的SD卡插槽,但默认情况下,Nexus 7或GNex都没有固定。

答案 1 :(得分:0)

对任何感兴趣的人来说,问题是我制作了一张sdcard.iso图像并将eclipse作为-sdcard命令行参数传递给AVD。无论出于何种原因,图像都是只读的。通过清除命令行参数并编辑AVD以使用大小为512mb的新SD卡而不是文件来修复此问题。

答案 2 :(得分:0)

在我的情况下,我对斜线有误。在eclipse中指定“附加仿真器命令行选项”

实际上它应该是-sdcard C:/ Kamal / sdcard / emulator_sdcard

我正在放-sdcard C:\ Kamal \ sdcard \ emulator_sdcard

然后重新启动Eclipse&amp;仿真器有效。

答案 3 :(得分:0)

  

try {

              InputStream inputStream2 = openFileInput("database.sqlite3");
              File outFile =new File(Environment.getExternalStorageDirectory(), "database15.sqlite3");
              outFile.createNewFile();
              OutputStream out= new FileOutputStream(outFile);
              byte[] buf = new byte[1024];
              int len;
              while((len = inputStream2.read(buf))> 0)
              {
                  out.write(buf);
              }
              out.close();
              Toast.makeText(getBaseContext(),getFilesDir().toString()+"Done", Toast.LENGTH_LONG).show();
      } catch (FileNotFoundException ex) {
          Toast.makeText(getBaseContext(),"file not found", Toast.LENGTH_LONG).show();
      } catch (IOException e) {
          Toast.makeText(getBaseContext(),e.getMessage(), Toast.LENGTH_LONG).show();
      }