web-dev-qa-db-ja.com

Android SDカードの書き込み、アクセス許可が拒否されました

以下のコードで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);
            }
        }
    }
  }
_
17
user329604

Manifest.xmlに追加

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
32
Butsaty

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

  1. スロットからSDカードを取り外す準備をしています
  2. 外付けUSBドライブとしてPCに接続されたデバイス
20

SDCARDにアクセスできることを確認する必要がある場合があります。コードでそれを行う方法は次のとおりです。

if(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
    Toast.makeText(this, "External SD card not mounted", Toast.LENGTH_LONG).show();
}
12
Temperage

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が宣言されている必要があることを認めましたが、1つのuses-sdkステートメントで機能し、他のステートメントでは機能しなかったのはなぜですか?

2
Tary

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

0
java dev