web-dev-qa-db-fra.com

Écriture de carte SD Android, autorisation refusée

J'essaie d'écrire un fichier sur la SDCard avec le code ci-dessous (permission Android.permission.WRITE_EXTERNAL_STORAGE déjà définie dans manifest.xml) . Lors de l'exécution de nmea_file.createNewFile();, une exception avec Permission Denied est levée.

Des suppositions pourquoi cela se produirait-il?

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

Ajouter à manifest.xml

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

Cela peut arriver si la carte SD est bloquée pour certaines opérations, telles que: 

  1. Préparation au démontage de la carte SD de son emplacement
  2. Périphérique connecté au PC en tant que lecteur USB externe
20
barmaley

Vous voudrez peut-être vérifier que vous avez accès à la carte SDCARD. Voici comment vous pouvez le faire dans le code:

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

Sachez que votre déclaration uses-sdk peut affecter votre capacité à écrire sur la carte SD (!).

Mon AndroidManifest.xml avait les caractéristiques suivantes:

<uses-sdk minSdkVersion="8"/>

Et je pouvais écrire sur la carte SD sans problème même si je n'avais pas déclaré Android.permission.WRITE_EXTERNAL_STORAGE.

Lorsque j'ai modifié ma déclaration uses-sdk en:

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

Toutes les écritures sur ma carte SD ont échoué avec une autorisation refusée! Certes, Android.permission.WRITE_EXTERNAL_STORAGE aurait dû être déclaré, mais pourquoi avec une instruction uses-sdk cela a fonctionné et l'autre non?

2
Tary

Vérifiez si sdcard est monté ou pas si vous archivez émulateur. Il ne faut pas non plus oublier de donner une certaine taille à la carte mémoire au moment de la création de l’émulateur. Ensuite, vous devez ajouter 
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
dans votre manifeste.

0
java dev