Environment.getExternalStorageDirectory不会返回可移动存储的path

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

我的应用程序将文件写入由getExternalStorageDirectory获得的path,并且我有用户要求一个选项,而不是写入到他们的可移动SD卡。 我一直认为getExternalStorageDirectory返回到可移动SD卡的path,但这不再是事实。 如何访问此SD卡的path?

根据源代码 ,执行getExternalStorageDirectory返回设备环境中设置为“外部存储”的任何内容:

 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)需要以下string之一:

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

所以它不是要返回SD卡的根。

替代:

最后, getExternalStorageState()将返回挂载在/mnt/sdcard/的文件系统。 根据CommonsWare在这个答案: find一个外部SD卡的位置 ,没有办法直接得到外部SD卡(如果它存在)。

另一种方法是检查isExternalStorageRemovable ()并给出一个手动选项,如果它是假的。

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

 Environment.getExternalStoragePublicDirectory(Environment.MEDIA_MOUNTED) returns:-------> /storage/sdcard0/mounted Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) returns:-------> /storage/sdcard0/DCIM Environment.getExternalStoragePublicDirectory(Environment.MEDIA_SHARED) returns:-------> /storage/sdcard0/shared Environment.MEDIA_MOUNTED returns:-------> mounted Environment.getExternalStorageDirectory() returned:-------> /storage/sdcard0 

所有返回内部手机内存的位置。