Używam następującego kodu, aby pobrać plik z mojego serwera, a następnie zapisać go w katalogu głównym karty SD, wszystko działa dobrze:
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());
}
}
}
Jednak użycie Environment.getExternalStorageDirectory();
oznacza, że plik zawsze będzie zapisywał w katalogu głównym /mnt/sdcard
. Czy można określić folder, w którym ma zostać zapisany plik?
Na przykład: /mnt/sdcard/myapp/downloads
Odpowiedzi:
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); ...
źródło
getExternalStorageDirectory()
zostało wycofane w API 29.Dodaj uprawnienia do manifestu systemu Android
Dodaj to uprawnienie WRITE_EXTERNAL_STORAGE do manifestu aplikacji.
<?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>
Sprawdź dostępność pamięci zewnętrznej
Zawsze powinieneś najpierw sprawdzić dostępność. Fragment oficjalnej dokumentacji Androida na temat pamięci zewnętrznej .
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; }
Użyj Filewriter
W końcu zapomnij o
FileOutputStream
i użyjFileWriter
zamiast niego. Więcej informacji na temat tej klasy można znaleźć w pliku FileWriter javadoc . Możesz tutaj dodać więcej obsługi błędów, aby poinformować użytkownika.// 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();
źródło
FileOutputStream
(cóż, nie obejmuje on alternatyw). Dlaczego lepiej jest użyćFileWriter
zamiast tego - czy jest szybszy / bardziej niezawodny / coś innego?FileWriter
ma wygodne metody bezpośredniego pisania ciągów znaków , które nie są obecne w plikuFileOutputStream
. Jeśli nie piszesz plików tekstowych,FileWriter
nie jest to zbyt pomocne. W rzeczywistości, jeśli piszesz plik obrazu , nie można tego w ogóle zrobić za pomocą.FileWriter
Oczywiście, jeśli naprawdę chcesz ładnego interfejsu API dla tekstu, zawiń goFileOutputStream
w a,PrintStream
a będziesz miał wszystkie te same metody, coSystem.out
.Tutaj znalazłem odpowiedź - http://mytechead.wordpress.com/2014/01/30/android-create-a-file-and-write-to-external-storage/
To mówi,
/** * 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; }
a następnie użyjmy tego kodu, aby faktycznie napisać do pamięci zewnętrznej:
// 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();
I to jest to. Jeśli teraz odwiedzisz swój / sdcard / your-dir-name / folder, zobaczysz plik o nazwie - My-File-Name.txt z zawartością określoną w kodzie.
PS: - Potrzebujesz następującego uprawnienia -
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
źródło
/sdcard/
nie zawsze jest sdcard.Aby pobrać plik do folderu pobierania lub muzyki na karcie SD
File downlodDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);// or DIRECTORY_PICTURES
I nie zapomnij dodać tych uprawnień w manifeście
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
źródło