2010-08-23 23 views
76

Sto usando il seguente codice per scaricare un file dal mio server quindi scrivere nella directory principale della scheda SD, tutto funziona bene:Android scrittura alla cartella della scheda 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()); 
     } 

    } 
} 

Tuttavia, utilizzando Environment.getExternalStorageDirectory(); significa che il file scriverà sempre alla radice /mnt/sdcard. È possibile specificare una determinata cartella in cui scrivere il file?

Ad esempio: /mnt/sdcard/myapp/downloads

Acclamazioni

Eef

+12

Inoltre, è necessario ricordare di aggiungere le autorizzazioni nella m per questo funziona .. timemirror

risposta

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

Cheers amico, funziona a meraviglia. – RailsSon

+1

Assicurarsi di utilizzare tutte le lettere minuscole nei nomi di directory e file. – BeccaP

+1

Posso sapere cosa significa "/ dir1/dir2" e senza questo non posso salvare il mio file in sdcard ah? – AndroidOptimist

29

Aggiungi Permesso di Android Manifest

Aggiungi this WRITE_EXTERNAL_STORAGE permission alle vostre applicazioni manifeste.

<?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> 

Verifica la disponibilità di storage esterno

Si dovrebbe sempre verificare la disponibilità prima. Un frammento di codice da 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; 
} 

Utilizzare un FileWriter

In ultimo, ma non meno importante dimenticare il FileOutputStream e utilizzare un FileWriter invece. Ulteriori informazioni su quel modulo di classe the FileWriter javadoc. Potresti voler aggiungere qualche altra gestione degli errori qui per informare l'utente.

// 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

Gli autori del libro Sto leggendo raccomanda di usare un 'FileOutputStream' (beh, non copre le alternative). Perché è meglio usare il 'FileWriter' invece - è più veloce/più affidabile/qualcos'altro? – aga

+3

@aga 'FileWriter' ha metodi convenienti per scrivere direttamente le stringhe, che non sono presenti in un' FileOutputStream'. Se non si stanno scrivendo file di testo, 'FileWriter' non è di grande aiuto. Infatti, se stai scrivendo un file * image *, non può essere fatto affatto con un 'FileWriter' Ovviamente, se vuoi * davvero * una buona API per il testo, avvolgi il tuo FileOutputStream in un 'PrintStream' e avrai gli stessi metodi di' System.out'. –

2

trovato la risposta qui - http://mytechead.wordpress.com/2014/01/30/android-create-a-file-and-write-to-external-storage/

Dice,

/** 

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

e quindi cerchiamo di utilizzare questo codice per scrivere in realtà per l'archiviazione esterna:

// 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(); 

E questo è. Se ora visiti la tua/sdcard/nome-dir-nome/cartella vedrai un file chiamato - My-File-Name.txt con il contenuto come specificato nel codice.

PS: - sono necessari i seguenti permessi -

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

La directory '/ sdcard /' non è sempre la sdcard. – CurlyCorvus

+0

Sono d'accordo con Curly. Sul mio telefono il metodo getExternalStorageDirectory restituisce una memoria emulata, che non è la sdcard. – Spindizzy

-1

Per scaricare un file da scaricare o cartella della musica SDCard

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

E non dimenticate di aggiungere questi autorizzazione manifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
Problemi correlati