web-dev-qa-db-fra.com

Comment créer un fichier sur le stockage interne Android?

Je veux enregistrer un fichier sur la mémoire interne dans un dossier spécifique. Mon code est:

File mediaDir = new File("media");
if (!mediaDir.exists()){
   mediaDir.createNewFile();
   mediaDir.mkdir();

}
File f = new File(getLocalPath());
f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
fos.write(data);
fos.close();

getLocalPath renvoie /data/data/myPackage/files/media/qmhUZU.jpg mais lorsque je veux créer le dossier de support, l'exception "Java.io.IOException: système de fichiers en lecture seule" est générée. Des idées sur la façon d'écrire mes fichiers sur le stockage interne du téléphone dans le support de dossier? Merci.

25
Buda Gavril

Vous devriez utiliser ContextWrapper comme ceci:

ContextWrapper cw = new ContextWrapper(context);
File directory = cw.getDir("media", Context.MODE_PRIVATE);

Comme toujours, reportez-vous à documentation , ContextWrapper a beaucoup à offrir.

22
Audrius

Vous devez créer le répertoire media ajouté à ce que getLocalPath() renvoie.

2
Lucas S.

J'avais aussi la même erreur exacte. Voici le correctif. Lorsque vous indiquez où écrire, Android résoudra automatiquement votre chemin en /data/ ou /mnt/sdcard/. Laisse-moi expliquer.

Si vous exécutez l'instruction suivante:

File resolveMe = new File("/data/myPackage/files/media/qmhUZU.jpg");
resolveMe.createNewFile();

Cela résoudra le chemin d'accès à la racine /data/ quelque part plus haut dans Android.

Je l'ai compris, car après avoir exécuté le code suivant, il a été automatiquement placé dans la racine /mnt/ sans que je traduise quoi que ce soit par moi-même. 

File resolveMeSDCard = new File("/sdcard/myPackage/files/media/qmhUZU.jpg");
resolveMeSDCard.createNewFile();

Une solution rapide serait de changer votre code suivant:

File f = new File(getLocalPath().replace("/data/data/", "/"));

J'espère que cela t'aides

2
styler1972

Écrire un fichier

Lors de l'enregistrement d'un fichier dans la mémoire interne, vous pouvez acquérir le répertoire approprié en tant que fichier en appelant l'une des deux méthodes suivantes:

getFilesDir ()

      Returns a File representing an internal directory for your app.

getCacheDir ()

     Returns a File representing an internal directory for your 
     app's temporary cache files.
     Be sure to delete each file once it is no longer needed and implement a reasonable 
     size limit for the amount of memory you use at any given time, such as 1MB.

Attention: Si le système manque de stockage, il est possible que vos fichiers de cache soient supprimés sans avertissement.

0
Magnetron