web-dev-qa-db-fra.com

Android écrire dans le dossier de la carte SD

J'utilise le code suivant pour télécharger un fichier de mon serveur, puis l'écrire dans le répertoire racine de la carte sd, tout fonctionne correctement:

package com.downloader;

import Java.io.File;
import Java.io.FileOutputStream;
import Java.io.InputStream;
import Java.net.HttpURLConnection;
import Java.net.URL;

import Android.os.Environment;
import Android.util.Log;

public class Downloader {

    public void DownloadFile(String fileURL, String fileName) {
        try {
            File root = Environment.getExternalStorageDirectory();
            URL u = new URL(fileURL);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            FileOutputStream f = new FileOutputStream(new File(root, fileName));

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = in.read(buffer)) > 0) {
                f.write(buffer, 0, len1);
            }
            f.close();
        } catch (Exception e) {
            Log.d("Downloader", e.getMessage());
        }

    }
}

Cependant, l'utilisation de Environment.getExternalStorageDirectory(); signifie que le fichier sera toujours écrit à la racine /mnt/sdcard. Est-il possible de spécifier un dossier dans lequel écrire le fichier?

Par exemple: /mnt/sdcard/myapp/downloads

À votre santé

Eef

79
RailsSon
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/dir1/dir2");
dir.mkdirs();
File file = new File(dir, "filename");

FileOutputStream f = new FileOutputStream(file);
...
156
plugmind

Ajouter la permission à Android Manifest

Ajoutez cette autorisation WRITE_EXTERNAL_STORAGE au manifeste de vos applications.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="your.company.package"
    Android:versionCode="1"
    Android:versionName="0.1">
    <application Android:icon="@drawable/icon" Android:label="@string/app_name">
        <!-- ... -->
    </application>
    <uses-sdk Android:minSdkVersion="7" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest> 

Vérifier la disponibilité du stockage externe

Vous devriez toujours vérifier la disponibilité en premier. Un extrait de l'officiel Android documentation sur le stockage externe .

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

Utiliser un Filewriter

Enfin, oubliez pas le FileOutputStream et utilisez plutôt FileWriter. Plus d'informations sur cette forme de classe le javadoc FileWriter . Vous voudrez peut-être ajouter un peu plus de traitement des erreurs ici pour informer l'utilisateur.

// get external storage file reference
FileWriter writer = new FileWriter(getExternalStorageDirectory()); 
// Writes the content to the file
writer.write("This\n is\n an\n example\n"); 
writer.flush();
writer.close();
29
hcpl

Vous avez trouvé la réponse ici - http://mytechead.wordpress.com/2014/01/30/Android-create-a-file-and-write-torexternal-storage/

Ça dit,

/**

* Method to check if user has permissions to write on external storage or not

*/

public static boolean canWriteOnExternalStorage() {
   // get the state of your external storage
   String state = Environment.getExternalStorageState();
   if (Environment.MEDIA_MOUNTED.equals(state)) {
    // if storage is mounted return true
      Log.v("sTag", "Yes, can write to external storage.");
      return true;
   }
   return false;
}

puis utilisons ce code pour écrire dans le stockage externe:

// get the path to sdcard
File sdcard = Environment.getExternalStorageDirectory();
// to this path add a new directory path
File dir = new File(sdcard.getAbsolutePath() + "/your-dir-name/");
// create this directory if not already created
dir.mkdir();
// create the file in which we will write the contents
File file = new File(dir, "My-File-Name.txt");
FileOutputStream os = outStream = new FileOutputStream(file);
String data = "This is the content of my file";
os.write(data.getBytes());
os.close();

Et c'est ça. Si vous visitez maintenant votre dossier/sdcard/votre nom de dossier /, vous verrez un fichier nommé - My-File-Name.txt avec le contenu spécifié dans le code.

PS: - Vous avez besoin de l'autorisation suivante -

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