2010-08-23 11 views
76

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 très bien:écriture Android au dossier de la carte SD

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 Environment.getExternalStorageDirectory(); signifie que le fichier écrira toujours à la racine /mnt/sdcard. Est-il possible de spécifier un certain dossier pour écrire le fichier?

Par exemple: /mnt/sdcard/myapp/downloads

Vive

Eef

+12

Aussi besoin de se rappeler d'ajouter les autorisations dans le m anifest pour que cela fonctionne .. timemirror

Répondre

149
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); 
... 
+0

Acclamations mec, fonctionne un régal. – RailsSon

+1

Veillez à utiliser toutes les lettres minuscules dans votre répertoire et les noms de fichiers. – BeccaP

+1

Puis-je savoir ce que cela signifie par "/ dir1/dir2" et sans cela, je ne peux pas enregistrer mon fichier dans la carte SD ah? – AndroidOptimist

29

Ajouter la permission à Android Manifest

Ajouter this WRITE_EXTERNAL_STORAGE permission à vos applications manifestes.

<?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é d'abord. Un extrait de the official android documentation on external storage.

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; 
} 

Utilisez un FileWriter

Enfin, mais pas moins oublier la FileOutputStream et utiliser un FileWriter à la place. Plus d'informations sur ce formulaire de classe the FileWriter javadoc. Vous voudrez peut-être ajouter un peu plus de gestion 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(); 
+1

Les auteurs du livre Je suis en train de lire recommande d'utiliser un 'FileOutputStream' (bien, cela ne couvre pas les alternatives). Pourquoi est-il préférable d'utiliser 'FileWriter' à la place - est-ce plus rapide/plus fiable/quelque chose d'autre? – aga

+3

@aga 'FileWriter' a des méthodes pratiques pour écrire directement des chaînes, qui ne sont pas présentes sur' FileOutputStream'. Si vous n'écrivez pas de fichiers texte, FileWriter ne vous aide pas beaucoup. En fait, si vous écrivez un fichier * image *, il ne peut pas vraiment être fait avec un 'FileWriter'. Bien sûr, si vous voulez vraiment une API sympa pour le texte, enveloppez votre FileOutputStream dans un 'PrintStream' et vous aurez toutes les mêmes méthodes que' System.out'. –

2

trouvé la réponse ici - http://mytechead.wordpress.com/2014/01/30/android-create-a-file-and-write-to-external-storage/

Il 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 nous allons utiliser ce code pour écrire réellement au 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 ce est-ce. Si maintenant vous visitez votre répertoire/sdcard/your-dir-name, vous verrez un fichier nommé - My-File-Name.txt avec le contenu spécifié dans le code.

PS: - Vous avez besoin de la permission suivante -

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+1

Le répertoire '/ sdcard /' n'est pas toujours le sdcard. – CurlyCorvus

+0

Je suis d'accord avec Curly. Sur mon téléphone, la méthode getExternalStorageDirectory renvoie un stockage émulé, qui n'est pas la carte SD. – Spindizzy

-1

Pour télécharger un fichier à télécharger ou dossier Music En SDCard

File downlodDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);// or DIRECTORY_PICTURES 

Et ne pas oublier d'ajouter ces autorisations dans manifeste

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
Questions connexes