IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

[Développement Android] : création d'un fichier sur carte SD


Sujet :

Android

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut [Développement Android] : création d'un fichier sur carte SD
    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é :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Salut !

    En fait je ne vois pas l’intérêt de taper en dur dans "/Android/data"...

    Les fichiers peuvent être:
    * Privés à une application (lisibles uniquement par l'application) : Context.getFilesDir() <= "/data/data/mon.package/files"
    * Privés à une application et de type "cache" (peuvent être effacer sans gêner l'utilisateur) : Context.getCacheDir() <= "/data/data/mon.package/cache"

    Externe (nécessite des droits: WRITE_EXTERNAL_STORAGE / READ_EXTERNAL_STORAGE , et de bien vérifier l'état du storage externe avec Environment.getExternalStorageState ! )
    * Associés à une application (lisibles par tout le monde, mais désinstallés avec l'application) : Context.getExternalFilesDir(xxx), remplacer "xxx" par le type de fichier, ou "null" pour la racine du répertoire. <= "Android/data/mon.package/files"
    * Associés à une application et de type "cache": Context.getExternalCacheDir() <= "Android/data/mon.package/cache"

    Publics (ne seront pas désinstallés si on enlève l'application):
    Environment.getExternalStoragePublicDirectory(xxx)
    La encore, on peut passer "null"


    Ensuite, pourquoi s'embeter avec des concaténation de chaines ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    FileOutputStream output = null;
    File storageDir = context.getExternalFilesDir(null);
    try {
       if (!(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())))
               return false;
     
       if (!storageDir.mkdirs())
               throw new IOException("Couldn't create directories !");
     
       File storageFile = new File(storageDir, nomFichier + "." + ext);  // j'ai peur que dans ton code il manque le '/' ???? l'interêt d'utiliser le constructeur c'est qu'on ne se soucie pas du File.SEPARATOR
       // storageFile.createNewFile(); ne sert à rien !!!! juste à créer de manière atomique le fichier et tester la valeur de retour, si on ne compte pas tester la valeur de retour, autant ne pas le faire !
     
       // write file ! 
       output = new FileOutputStream(storageFile);
       ....
       ....
     
    } catch (Exception ex) {
       Log.e("XXXXXX","Couldn't create file in "+storageDir.toString(),ex);
    } finally {
       if (output != null) try { output.close(); } catch (IOException ioe) { Log.wtf("XXXXXX","Couldn't close output-stream !",ioe); }
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bonjour et merci pour la réponse !

    Alors pourquoi concaténer ? Je ne connaissais juste pas ces différentes méthodes... j'ai utilisé getExternalFilesDir, ce qui simplifie effectivement la gestion de l'arborescence.
    Seulement, j'ai eu un peu de mal à tester vu que mon fameux répertoire existait dans un img que je n'arrivais pas à identifier. J'ai donc fait un gros ménage en supprimant entre autres l'AVD.
    Sur l'émulateur, ça fonctionne ! Alors je ne sais pas quelle action est responsable, mais quoiqu'il en soit, merci !!
    J'ai également installé sur mon véritable téléphone, j'ai eu un petit message Toast m'indiquant que la méthode de sauvegarde était passée sans exception. Ceci dit, pas moyen de retrouver ce fichier (ni l'arborescence). Mais j'ai vérifié rapidement, je regarde tout ça dès que possible.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bon, petit retour...
    Sur l'émulateur, tout est ok et se passe comme un charme.
    Mais sur mon téléphone réel, le fichier ne se crée pas vraiment où je l'attendais. En branchant mon téléphone sur le PC, j'ai 2 lecteurs : 1 "carte SD" et 1 "Mémoire de stockage interne".
    Et c'est dans cette mémoire de stockage interne que le fichier se crée.
    J'ai cru comprendre après recherches qu'il existait un stockage externe primaire (sur le téléphone) et secondaire (sur la carte SD), et que les méthodes précitées renvoyaient un chemin vers le stockage externe primaire.

    Alors ce n'est pas bloquant, je ne devrais pas écrire des dizaines de Mo dans ce fichier, mais si des méthodes similaires à celles données par nicroman existent pour ce stockage externe secondaire, je suis preneur.

Discussions similaires

  1. Création d'un fichier sur le réseau
    Par Luffy Duck dans le forum Langage
    Réponses: 23
    Dernier message: 10/01/2008, 16h56
  2. Réponses: 2
    Dernier message: 18/01/2007, 17h53
  3. Réponses: 2
    Dernier message: 01/06/2006, 08h52
  4. la date de création d'un fichier sur un site ftp??
    Par timsah dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/01/2006, 21h27
  5. Réponses: 4
    Dernier message: 15/09/2005, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo