Android 将下载的数据保存到 SD
Android save downloaded data to SD
我开发了一款应用
- 下载一些数据(.png 和.wav 文件)
- 插入每个文件下载到数据库的路径 (SQLite)
到目前为止一切顺利,一切正常。
一些用户问我是否有办法将下载的数据移动到 sd 卡中以保存一些内部 space.
现在我用这行代码创建了目录
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
所以我的问题是:
- 我在哪里以及如何将我的应用程序的私人数据(.png 和 .wav 文件)保存在 SD 卡中?
试试这个
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/newfolder");
dir.mkdirs();
在 Manifest 文件中添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
getExternalFilesDir
,getExternalStorageDirectory
还是亲戚,不总是returnSD卡上的文件夹。以我的三星为例,它 return 是一个模拟的内部 SD 卡。
您可以使用 ContextCompat.getExternalFilesDirs
.
获取所有外部存储设备(包括可移动设备)
我的下一步是使用设备上可用空间最大的文件夹 space。为此,我枚举了 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;
}
我开发了一款应用 - 下载一些数据(.png 和.wav 文件) - 插入每个文件下载到数据库的路径 (SQLite)
到目前为止一切顺利,一切正常。 一些用户问我是否有办法将下载的数据移动到 sd 卡中以保存一些内部 space.
现在我用这行代码创建了目录
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
所以我的问题是: - 我在哪里以及如何将我的应用程序的私人数据(.png 和 .wav 文件)保存在 SD 卡中?
试试这个
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/newfolder");
dir.mkdirs();
在 Manifest 文件中添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
getExternalFilesDir
,getExternalStorageDirectory
还是亲戚,不总是returnSD卡上的文件夹。以我的三星为例,它 return 是一个模拟的内部 SD 卡。
您可以使用 ContextCompat.getExternalFilesDirs
.
我的下一步是使用设备上可用空间最大的文件夹 space。为此,我枚举了 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;
}