簡體   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