2010-08-23 10 views
76

ich den folgenden Code verwenden eine Datei von meinem Server zum Download dann schreiben Sie es in das Stammverzeichnis der SD-Karte, alles funktionieren gut:Android Schreiben auf SD-Karte Ordner

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

    } 
} 

jedoch Environment.getExternalStorageDirectory(); mit bedeutet, dass die Datei immer in den Stamm /mnt/sdcard schreiben wird. Ist es möglich, einen bestimmten Ordner anzugeben, in den die Datei geschrieben werden soll?

Zum Beispiel: /mnt/sdcard/myapp/downloads

Prost

Eef

+12

Auch müssen Sie daran denken, die Berechtigungen in der m Anifest, damit das funktioniert. timemirror

Antwort

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

Prost Kumpel, funktioniert ein Vergnügen. – RailsSon

+1

Achten Sie darauf, alle Kleinbuchstaben in Ihren Verzeichnis- und Dateinamen zu verwenden. – BeccaP

+1

Darf ich wissen, was es mit "/ dir1/dir2" bedeutet und ohne diese kann ich meine Datei in SD-Karte ah nicht speichern? – AndroidOptimist

29

hinzufügen Erlaubnis zum Android Manifest

hinzufügen this WRITE_EXTERNAL_STORAGE permission, um Ihre Anwendungen manifestieren.

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

Verfügbarkeit prüfen externer Speicher

Sie sollten immer zuerst für die Verfügbarkeit überprüfen. Ein Schnipsel von 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; 
} 

Verwenden Sie ein Filewriter

Endlich but not least vergessen die FileOutputStream und FileWriter stattdessen verwenden. Weitere Informationen zu diesem Klassenformular the FileWriter javadoc. Möglicherweise möchten Sie hier weitere Fehlerbehandlung hinzufügen, um den Benutzer zu informieren.

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

Die Autoren des Buches Ich lese empfiehlt, einen 'FileOutputStream' zu verwenden (gut, es deckt die Alternativen nicht ab). Warum ist es besser den 'FileWriter' zu verwenden - ist es schneller/zuverlässiger/etwas anderes? – aga

+3

@aga 'FileWriter' verfügt über bequeme Methoden zum direkten Schreiben von Strings, die auf einem' FileOutputStream' nicht vorhanden sind. Wenn Sie keine Textdateien schreiben, ist 'FileWriter' nicht hilfreich. In der Tat, wenn Sie eine * image * Datei schreiben, kann es mit einem 'FileWriter 'überhaupt nicht gemacht werden. Natürlich, wenn Sie * wirklich * eine nette API für Text wünschen, wickeln Sie Ihren' FileOutputStream' in a 'PrintStream' und Sie haben alle die gleichen Methoden wie' System.out'. –

2

die Antwort hier gefunden - http://mytechead.wordpress.com/2014/01/30/android-create-a-file-and-write-to-external-storage/

Es sagt,

/** 

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

und dann lass uns diesen Code verwenden tatsächlich auf den externen Speicher schreiben:

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

Und das ist es. Wenn Sie jetzt Ihre/SD-Karte/Ihr-Verzeichnis-Name/Ordner besuchen, sehen Sie eine Datei namens - Meine-Datei-Name.txt mit dem Inhalt wie im Code angegeben.

PS: - Sie benötigen die folgende Erlaubnis -

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

Das Verzeichnis '/ sdcard /' ist nicht immer die SD-Karte. – CurlyCorvus

+0

Ich stimme Curly. Auf meinem Telefon gibt die Methode getExternalStorageDirectory einen emulierten Speicher zurück, der nicht die SD-Karte ist. – Spindizzy

-1

Um eine Datei herunterzuladen, zum Download oder Musikordner In SDCard

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

Und vergessen Sie nicht, diese Erlaubnis hinzuzufügen in manifest

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