Запись на SD-карту Android, доступ запрещен - PullRequest
17 голосов
/ 22 декабря 2010

Я пытаюсь записать файл на 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);
            }
        }
    }
  }

Ответы [ 5 ]

32 голосов
/ 08 декабря 2011

Добавить в manifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
20 голосов
/ 22 декабря 2010

Это может произойти, если SD-карта заблокирована для некоторых операций, например:

  1. Подготовка к отключению SD-карты из слота
  2. Устройство, подключенное к ПК в качестве внешнего USB-накопителя
12 голосов
/ 29 мая 2011

Возможно, вы захотите проверить, есть ли у вас доступ к SDCARD.Вот как вы можете сделать это в коде:

if(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
    Toast.makeText(this, "External SD card not mounted", Toast.LENGTH_LONG).show();
}
2 голосов
/ 17 апреля 2012

Имейте в виду, что ваша инструкция использования-sdk может повлиять на вашу возможность записи на SD-карту (!).

Мой AndroidManifest.xml имел следующее:

<uses-sdk minSdkVersion="8"/>

И я мог без проблем записать на SD-карту, хотя я не объявил android.permission.WRITE_EXTERNAL_STORAGE.

Когда я изменил свой оператор Use-SDK на:

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

Все записи с моей SD-карты завершились неудачно с отказом в разрешении! Разумеется, android.permission.WRITE_EXTERNAL_STORAGE должен был быть объявлен, но почему с одним оператором using-sdk это сработало, а с другим - нет?

0 голосов
/ 27 февраля 2013

Проверьте, установлена ​​ли sdcard или нет, если вы проверяете в эмуляторе. Также не забудьте указать некоторые размеры для sdcard во время создания эмулятора. Затем вам нужно добавить
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
в вашем манифесте.

...