所以我知道有SD卡访问API允许我们通过DocumentProvider和DocumentFiles编写文件。我已经使它可以在可移动SD卡上工作。我总是对外部和内部存储感到困惑。我一直认为外部存储总是SD卡,但今天我才知道它并非如此。
所以我有三个问题。
问题1 ,如何知道文件是否存储在外部模拟存储或SD卡中? 一种解决方案可能是通过在文件路径中搜索“sdcard0”或“emulated”的实例。 这个解决方案总是有效吗?我的意思是在所有手机上?
问题2 在模拟存储(不可移动外部存储)普通文件或DocumentFile上写入文件的用途是什么?
问题3 如果Q2的解决方案是文档文件,那么为什么这不起作用?
private static String [] getExtSdCardPaths(){ List paths = new ArrayList<>();
for (File file : GlobalSongList.GetInstance().getApplicationContext().getExternalFilesDirs("external")) {
if (file != null && !file.equals(GlobalSongList.GetInstance().getApplicationContext().getExternalFilesDir("external"))) {
int index = file.getAbsolutePath().lastIndexOf("/Android/data");
if (index < 0) {
Log.w("StorageAccessAPI", "Unexpected external file dir: " + file.getAbsolutePath());
}
else {
String path = file.getAbsolutePath().substring(0, index);
try {
path = new File(path).getCanonicalPath();
}
catch (IOException e) {
// Keep non-canonical path.
}
paths.add(path);
}
}
}
return paths.toArray(new String[paths.size()]);
}
答案 0 :(得分:0)
所以我知道有SD卡访问API允许我们通过DocumentProvider和DocumentFiles编写文件。
您指的是the Storage Access Framework。这允许您读取和写入流,而不是文件,其中流由文档提供程序支持。用户选择要使用的文档提供者,这反过来又决定了流的内容的存储位置。这可以是本地的(例如external storage,removable storage)或远程(Google云端硬盘,Dropbox,Samba文件服务器,Web服务器,FTP服务器,SFTP服务器等)。
如何知道文件是存储在外部模拟存储还是SD卡中?
如果您使用的是存储访问框架,则不知道存储流的内容的位置。
用于在模拟存储(不可移动外部存储)普通文件或DocumentFile上写入文件的内容?
如果您明确要使用外部存储,请使用外部存储。
使用存储访问框架允许用户选择存储流内容的位置,可能是也可能不是外部存储。
为什么这不起作用?
我不知道你期望做什么。我希望它能返回一系列无用的字符串。