web-dev-qa-db-fra.com

FileNotFoundException (autorisation refusée) lors de la tentative d'écriture du fichier sur la carte SD dans Android

Comme vous pouvez le remarquer dans le titre, j'ai un problème avec l'écriture du fichier sur la carte SD dans Android. J'ai vérifié cette question mais cela ne m'a pas aidé. Je veux écrire un fichier qui sera dans l'espace public sur sdcard afin que toute autre application puisse le lire.

Tout d'abord, je vérifie si la carte SD est montée:

Environment.getExternalStorageState();

Ensuite, je lance ce code:

File baseDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    baseDir.mkdirs();
    File file = new File(baseDir, "file.txt");
    try {
        FileOutputStream out = new FileOutputStream(file);
        out.flush();
        out.close();
        Log.d("NEWFILE", file.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }

J'ai:

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

<application>
...
</application>
</manifest>

dans mon AndroidManifest.xml.

L'erreur exacte est la suivante:

Java.io.FileNotFoundException: /storage/1510-2908/Download/secondFile.txt: open failed: EACCES (Permission denied)

Je teste mon code sur l'émulateur (émulation de l'API Nexus5 23). Ma version SDK minimale requise est de 19 (4.4 KitKat).


De plus, tout fonctionne bien avec l'écriture de fichiers dans un dossier privé sur une carte SD avec le même code, je dirais donc que l'ancien code devrait également fonctionner:

File newFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "esrxdtcfvzguhbjnk.txt");
    newFile.getParentFile().mkdirs();
    try {
        FileOutputStream out = new FileOutputStream(newFile);
        out.flush();
        out.close();
        Log.d("NEWFILE", newFile.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }

Quelqu'un sait-il quel pourrait être le problème? Serait-il possible que KitKat 4.4 ne permette tout simplement plus d'écrire dans l'espace public dans sdcard ou?

16
Drag0
  1. Tout fonctionne bien avec l'écriture de fichiers dans un dossier privé sur la carte SD

À partir de Android 4.4, ces autorisations ne sont pas requises si vous lisez ou écrivez uniquement des fichiers privés de votre application. Pour plus d'informations, consultez enregistrement de fichiers qui sont privé.

  1. FileNotFoundException (autorisation refusée) lors de la tentative d'écriture d'un fichier sur une carte SD dans Android

Comme vous essayez d'écrire le fichier dans l'émulateur ayant l'API 23 (Marshmallow), vous devez demander WRITE_EXTERNAL_STORAGE autorisation à l'exécution également. Vérifiez ce et ce pour plus de détails.

24
Dhaval Patel