2

我的 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 shell 中重新安装 SD 卡:

mount -o remount rw /mnt/sdcard

……但无济于事。AVD 还设置了“SD 卡支持”标志。不知道从这里做什么,有什么想法吗?

4

4 回答 4

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 默认也没有修复这个问题。

于 2012-11-13T06:02:54.283 回答
0

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

于 2012-11-19T04:10:23.020 回答
0

就我而言,我对斜线有误。在eclipse中指定“附加模拟器命令行选项”时

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

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

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

于 2013-02-06T10:09:55.220 回答
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();
      }
于 2013-05-15T11:31:08.233 回答