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?

1
Vesco 5 Jän. 2016 im 14:33

2 Antworten

Beste Antwort

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;
    }
2
GvS 5 Jän. 2016 im 12:14

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" /> 
0
Gaurav 5 Jän. 2016 im 11:47