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 シェルで SD カードを再マウントしようとしました。

mount -o remount rw /mnt/sdcard

...しかし、役に立たない。AVD には、「SD カード サポート」フラグも設定されています。ここから何をすべきかわからない、何かアイデアはありますか?

4

4 に答える 4

5

Honeycomb 以降、Android デバイスはデフォルトで、サードパーティ製アプリによる外部リムーバブル ストレージへの書き込みを許可しません。これを確認するには、adb シェルを起動し、/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カードスロットをまだ持っている一部のメーカー(Samsungが知っている)は、これを自分で修正しましたが、Nexus 7またはGNexでさえ、デフォルトでこれを修正していません.

于 2012-11-13T06:02:54.283 に答える
0

興味のある人にとっては、問題は私がsdcard.isoイメージを作成し、それを-sdcardコマンドライン引数としてAVDに渡す日食を持っていたことでした。何らかの理由で、画像は読み取り専用でした。コマンドライン引数をクリアし、AVDを編集して、ファイルではなくサイズ512mbの新しいSDカードで開始することで問題を修正しました。

于 2012-11-19T04:10:23.020 に答える
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 に答える
0

私の場合、スラッシュに間違いがあります。Eclipseで「追加のエミュレーターコマンドラインオプション」を指定している間

実際には -sdcard C:/Kamal/sdcard/emulator_sdcard である必要があります

-sdcard C:\Kamal\sdcard\emulator_sdcard を入れていました

その後、Eclipse & Emulator を再起動すると動作します。

于 2013-02-06T10:09:55.220 に答える