Environment.getExternalStorageDirectory不返回可移动存储的路径

时间:2011-05-18 18:07:19

标签: android

从API级别8开始,Android似乎重新定义了“外部”存储。阅读getExternalStorageDirectory附带getExternalStorageDirectory的文档,我看到评论:“不要在这里混淆'外部'这个词。这个目录可以更好地被视为媒体/共享存储..在具有多个“外部”存储目录的设备中......,此目录表示用户将与之交互的“主要”外部存储。“

我的应用将文件写入getExternalStorageDirectory获取的路径,我让用户要求选择写入可移动SD卡。我一直认为{{1}}返回了可移动SD卡的路径,但这不再是真的。如何访问此SD卡的路径?

3 个答案:

答案 0 :(得分:32)

According to the sourcegetExternalStorageDirectory用于返回设备环境中设置为“外部存储”的内容:

public static File getExternalStorageDirectory() {
    return EXTERNAL_STORAGE_DIRECTORY;
}

EXTERNAL_STORAGE_DIRECTORY是:

private static final File EXTERNAL_STORAGE_DIRECTORY
        = getDirectory("EXTERNAL_STORAGE", "/sdcard");

static File getDirectory(String variableName, String defaultPath) {
    String path = System.getenv(variableName);
    return path == null ? new File(defaultPath) : new File(path);
}

相反,getExternalStoragePublicDirectory(String type)需要其中一个字符串:

  

DIRECTORY_MUSIC,DIRECTORY_PODCASTS,DIRECTORY_RINGTONES,DIRECTORY_ALARMS,DIRECTORY_NOTIFICATIONS,DIRECTORY_PICTURES,DIRECTORY_MOVIES,DIRECTORY_DOWNLOADS或DIRECTORY_DCIM。 可能不会为空

所以它并不意味着返回SD卡根。

另一种选择:

最后,getExternalStorageState()将返回/mnt/sdcard/中挂载的文件系统。根据CommonsWare的回答:Find an external SD card location,没有办法直接获取外部SD卡(如果它甚至存在)。

另一种方法是检查isExternalStorageRemovable (),如果错误则提供手动选项。

答案 1 :(得分:2)

对于API 17,我得到以下回报:

{{1}}

内部手机记忆库的所有返回位置。

答案 2 :(得分:1)

要确保您正在访问sd卡,可以使用:

System.getenv(“ SECONDARY_STORAGE”)

但是-请记住,即使您在清单中设置了所有正确的权限,  第三方应用程序唯一可以在您的外部卡上写入的位置是“它们自己的目录” (即/ sdcard / Android / data /)

尝试写到其他任何地方,您将获得异常:     EACCES(权限被拒绝)