Android将下载的数据保存到SD

时间:2016-01-05 11:33:58

标签: android sd-card

我开发了一款应用程序 - 下载一些数据(.png和.wav文件) - 将每个文件下载的路径插入数据库(SQLite)

到目前为止一切顺利,一切正常。 有些用户问我是否有办法在sd卡中移动下载的数据以节省一些内部空间。

现在我用这行代码创建目录

File directory = getApplicationContext().getDir("folderName", Context.MODE_PRIVATE);

然后,应用程序将填充我下载的所有内容。

我尝试使用这段代码:

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

这会创建一个文件夹和一个文本文件到:/storage/emulated/0/TestFolder/MyTest.txt 哪个不是我的sdcard目录,应该是: /storage/sdcard1/TestFolder/MyTest.txt

所以我的问题是: - 我在SD卡中保存应用程序私人数据(.png和.wav文件)的位置和方式?

2 个答案:

答案 0 :(得分:2)

getExternalFilesDirgetExternalStorageDirectory或亲戚并不总是返回SD卡上的文件夹。例如,在我的三星上,它返回一个模拟的内部SD卡。

您可以使用ContextCompat.getExternalFilesDirs获取所有外部存储设备(也称为可移动设备)。

我的下一步是使用具有最大可用空间的设备上的文件夹。为此,我枚举getExternalFilesDirs,并在每个文件夹上调用getUsableSpace

我使用此代码将位图存储(缓存)在设备上名为“bmp”的文件夹中。

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

答案 1 :(得分:0)

试试这个

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/newfolder");
dir.mkdirs();

在清单文件中添加权限

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