在模拟存储中的棒棒糖中编写文件?

时间:2016-02-11 15:56:14

标签: android android-5.0-lollipop

所以我知道有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()]);

}

1 个答案:

答案 0 :(得分:0)

  

所以我知道有SD卡访问API允许我们通过DocumentProvider和DocumentFiles编写文件。

您指的是the Storage Access Framework。这允许您读取和写入,而不是文件,其中流由文档提供程序支持。用户选择要使用的文档提供者,这反过来又决定了流的内容的存储位置。这可以是本地的(例如external storageremovable storage)或远程(Google云端硬盘,Dropbox,Samba文件服务器,Web服务器,FTP服务器,SFTP服务器等)。

  

如何知道文件是存储在外部模拟存储还是SD卡中?

如果您使用的是存储访问框架,则不知道存储流的内容的位置。

  

用于在模拟存储(不可移动外部存储)普通文件或DocumentFile上写入文件的内容?

如果您明确要使用外部存储,请使用外部存储。

使用存储访问框架允许用户选择存储流内容的位置,可能是也可能不是外部存储。

  

为什么这不起作用?

我不知道你期望做什么。我希望它能返回一系列无用的字符串。