Bonjour à tous,
Après une soirée de googlage et de tirage de cheveux, je viens vous demander de l'aide pour un problème basique : écrire dans un fichier sur la carte SD dans le cadre d'un développement d'application android. A noter que j'utilise pour la 1ère fois Android Studio, ceci explique peut-être cela.
Premier point louche, l'AVD manager. Une fois celui-ci lancé, je veux modifier mon appareil (API23, Android 6.0, x86_64), puis clique sur "Show Advanced Settings" pour obtenir les options sur la SD card. Je choisis External file et récupère un .img de 100Mo (qui m'a l'air valide puisque qu'il contient une arborescence Android/data) et je clique sur Finish. Après plusieurs dizaines de secondes, la fenêtre se ferme. Par acquis de conscience, je clique sur "View details" de mon appareil, et je vois que la carte SD n'est pas du tout celle que j'ai définie, mais un chemin comme celui-là : C:\Users\<ma session>\.android\avd\<mon avd>.avd\sdcard.img
Déjà, je ne comprends pas pourquoi je ne peux pas utiliser mon fichier img. C'est peut-être la source des problèmes qui suivent.
Bref, admettons que le stockage soit dans un autre .img...
Le principe de mon code est de créer un fichier de données s'il n'existe pas. Le test d'existence fonctionne parfaitement, mais c'est la création du fichier qui tombe en exception. Voici mon code en résumé :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| File fichTxt;
fichTxt = new File(pathAppli + nomFichier + "." + ext);
fichTxt.setWritable(true);
try{
if (!(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())))
return false;
if (!fichTxt.exists()) {
fichTxt.getParentFile().mkdirs();
fichTxt.createNewFile();
}
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
} |
La variable pathAppli contient
Environment.getExternalStorageDirectory().getPath() + "/Android/data/" + contexte.getPackageName() + "/files/";
Et là, exception au niveau du createNewFile (java.io.IOException: open failed: ENOENT (No such file or directory)). Mon manifest contient bien la permission adaptée : <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Après moult manipulations, il s'avère que le mkdirs ne fonctionne pas, d'où l'impossibilité de créer le fichier. J'ai avancé petit à petit, et le mkdirs fonctionne si je m'arrête au répertoire data, mais semble tomber en erreur au niveau du packageName (qui ne contient pas de caractère spécial, c'est de la forme com.nom1.nom2.nom3).
J'ai alors créé manuellement ce répertoire via le file manager, et d'un coup, miracle, tout fonctionne.
Cependant, le file manager permet de créer un répertoire mais pas d'en supprimer ! Et toute tentative de code pour supprimer ce répertoire com.nom1.nom2.nom3 rate lamentablement.
Et comme je ne trouve pas le fichier .img utilisé pour émuler la carte SD (non, ce n'est pas non plus la carte SD qui est dans c:/users !), je me retrouve bloqué pour débuguer sur l'AVD.
Pas encore trop découragé, je me dis que ce problème est lié à l'AVD et je décide de tester sur mon téléphone. J'installe donc l'application et je la lance. Le répertoire recherché est /storage/emulated/0/Android/data/com.nom1.nom2.nom3/files/ et la création du fichier dans ce répertoire, comme sur l'AVD, plante. Avec un explorer, je vérifie l'arborescence de mon téléphone, et je vois que le répertoire de la carte SD est /storage/72AD-2013/Android/etc.
Par curiosité, je code ce chemin en dur, génère l'APK et l'installe sur mon téléphone. Cela fonctionne, l'aborescence et le fichier sont bien créés.
Alors par pitié, j'ai l'impression qu'il y a différents problèmes dans mon histoire, et j'aimerais vraiment y voir plus clair. Je prends toutes vos idées !
Partager