Ich habe eine App entwickelt, die - einige Daten herunterladen (.png- und .wav-Dateien) - den Pfad einfügt, unter dem jede Datei in eine Datenbank heruntergeladen wird (SQLite)
So weit so gut, alles funktioniert. Einige Benutzer fragten mich, ob es eine Möglichkeit gebe, die heruntergeladenen Daten auf die SD-Karte zu verschieben, um internen Speicherplatz zu sparen.
Inzwischen erstelle ich das Verzeichnis mit dieser Codezeile
File directory = getApplicationContext().getDir("folderName", Context.MODE_PRIVATE);
Dann füllt die App es mit all den Sachen, die ich heruntergeladen habe.
Ich habe versucht, diesen Code zu verwenden:
try {
File newFolder = new File(Environment.getExternalStorageDirectory(), "TestFolder");
if (!newFolder.exists()) {
newFolder.mkdir();
}
try {
File file = new File(newFolder, "MyTest" + ".txt");
file.createNewFile();
System.out.println("Path: " + file.getPath());
} catch (Exception ex) {
System.out.println("ex: " + ex);
}
} catch (Exception e) {
System.out.println("e: " + e);
}
Und dies erstellt einen Ordner und eine Textdatei in: /storage/emulated/0/TestFolder/MyTest.txt Das ist nicht mein SD-Kartenverzeichnis, es sollte sein: /storage/sdcard1/TestFolder/MyTest.txt
Meine Frage lautet also: - Wo und wie habe ich die privaten Daten meiner App (PNG- und WAV-Dateien) auf der SD-Karte gespeichert?
2 Antworten
Der getExternalFilesDir
, getExternalStorageDirectory
oder Verwandte gibt nicht immer einen Ordner auf einer SD-Karte zurück. Auf meinem Samsung wird beispielsweise eine emulierte interne SD-Karte zurückgegeben.
Sie können alle externen Speichergeräte (auch die austauschbaren) über ContextCompat.getExternalFilesDirs
.
Mein nächster Schritt besteht darin, den Ordner auf dem Gerät mit dem größten freien Speicherplatz zu verwenden. Um das zu bekommen, zähle ich die getExternalFilesDirs
auf und rufe getUsableSpace
für jeden Ordner auf.
Ich verwende diesen Code, um Bitmaps in einem Ordner mit dem Namen "bmp" auf dem Gerät zu speichern (zwischenzuspeichern).
@SuppressWarnings("ResultOfMethodCallIgnored")
private static File[] allCacheFolders(Context context) {
File local = context.getCacheDir();
File[] extern = ContextCompat.getExternalCacheDirs(context);
List<File> result = new ArrayList<>(extern.length + 1);
File localFile = new File(local, "bmp");
localFile.mkdirs();
result.add(localFile);
for (File anExtern : extern) {
if (anExtern == null) {
continue;
}
try {
File externFile = new File(anExtern, "bmp");
externFile.mkdirs();
result.add(externFile);
} catch (Exception e) {
e.printStackTrace();
// Probably read-only device, not good for cache -> ignore
}
}
return result.toArray(new File[result.size()]);
}
private static File _cachedCacheFolderWithMaxFreeSpace;
private static File getCacheFolderWithMaxFreeSpace(Context context) {
if (_cachedCacheFolderWithMaxFreeSpace != null) {
return _cachedCacheFolderWithMaxFreeSpace;
}
File result = null;
long free = 0;
for (File folder : allCacheFolders(context)) {
if (!folder.canWrite()) {
continue;
}
long currentFree = folder.getUsableSpace();
if (currentFree < free) {
continue;
}
free = currentFree;
result = folder;
}
_cachedCacheFolderWithMaxFreeSpace = result;
return result;
}
Versuche dies
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/newfolder");
dir.mkdirs();
Berechtigung in Manifest-Datei hinzufügen
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Neue Fragen
android
Android ist Googles mobiles Betriebssystem, mit dem digitale Geräte (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) programmiert oder entwickelt werden. Verwenden Sie für Themen im Zusammenhang mit Android Android-spezifische Tags wie Android-Intent, Android-Aktivität, Android-Adapter usw. Verwenden Sie für andere Fragen als Entwicklung oder Programmierung, die sich jedoch auf das Android-Framework beziehen, diesen Link: https: // android.stackexchange.com.