繁体   English   中英

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

[英]Android SD card on emulator writing fails with IOException EROFS (Read-only filesystem), have correct permission

我的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卡支持”标志。 不知道从这里做什么,有什么想法吗?

从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”。 如果您的手机已扎根(应该是您的仿真器),则可以修改platform.xml文件以添加另一个具有此权限的组。 它看起来应该像这样:

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

一些制造商(我知道三星确实如此)仍然在手机上保留了SD卡插槽,但他们自己也可以解决此问题,但即使是Nexus 7或GNex,默认情况下也无法解决此问题。

对于任何有兴趣的人来说,问题是我制作了一个sdcard.iso映像并将Eclipse作为-sdcard命令行参数传递给了AVD。 无论出于何种原因,该图像都是只读的。 通过清除命令行参数并编辑AVD以新的512MB大小的SD卡(而不是文件)开始解决此问题。

就我而言,我对斜线有误。 在日食中指定“其他仿真器命令行选项”时

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

我把-sdcard C:\\ Kamal \\ sdcard \\ emulator_sdcard

然后,在重新启动Eclipse&Emulator之后,它就可以工作了。

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(); } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM