17

以下のコードで SDCard にファイルを書き込もうとしています (権限android.permission.WRITE_EXTERNAL_STORAGEは manifest.xml で既に設定されています)。実行するnmea_file.createNewFile();と、例外がスローされますPermission Denied

なぜこれが起こっているのでしょうか?

if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 
  {
     Log.d(TAG, "Sdcard was not mounted !!" ); 
  }
else
  {
    File nmea_file; 
    File root = Environment.getExternalStorageDirectory();
    FileWriter nmea_writer = null;
    try {
        nmea_file = new File(root,"NMEA.txt");
        if(!nmea_file.exists()) {
                Log.w(TAG, "File Doesn't Exists!");
                nmea_file.createNewFile();
            }
        nmea_writer = new FileWriter(nmea_file);
        nmea_writer.append(nmea);
        nmea_writer.flush();
    }
    catch (IOException e) 
    {
        Log.w(TAG, "Unable to write", e);
    } 
    finally 
    {
        if (nmea_writer != null) 
        {
            try 
            {
                nmea_writer.close();
            } 
            catch (IOException e) 
            {
                Log.w(TAG, "Exception closing file", e);
            }
        }
    }
  }
4

5 に答える 5

31

マニフェスト.xmlに追加

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2011-12-08T12:49:42.583 に答える
20

次のような一部の操作で SD カードがブロックされている場合に発生する可能性があります。

  1. SD カードをスロットから取り外す準備をしています
  2. 外部 USB ドライブとして PC に接続されたデバイス
于 2010-12-22T09:28:39.073 に答える
12

SDCARD にアクセスできることを確認してください。コードでそれを行う方法は次のとおりです。

if(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
    Toast.makeText(this, "External SD card not mounted", Toast.LENGTH_LONG).show();
}
于 2011-05-28T22:09:13.437 に答える
2

uses-sdk ステートメントは、SD カードへの書き込み機能に影響を与える可能性があることに注意してください (!)。

私の AndroidManifest.xml には次のものがありました。

<uses-sdk minSdkVersion="8"/>

そして、android.permission.WRITE_EXTERNAL_STORAGEを宣言していなくても問題なくSDカードに書き込めました。

uses-sdk ステートメントを次のように変更したとき:

<uses-sdk android:targetSdkVersion="9" minSdkVersion="8" />

すべての SD カードへの書き込みが、許可が拒否されて失敗しました! android.permission.WRITE_EXTERNAL_STORAGE を宣言する必要があることを認めましたが、なぜ一方の uses-sdk ステートメントで機能し、もう一方のステートメントで機能しなかったのですか?

于 2012-04-17T17:50:44.547 に答える
1

エミュレータでチェックインする場合は、sdcard がマウントされているかどうかを確認します。また、エミュレータの作成時にSDカードのサイズを指定することを忘れないでください。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
次に、マニフェストに追加する必要があります。

于 2013-02-27T12:41:44.693 に答える