关于Environment.getExternalStorageState()的介绍

Environment.getExternalStorageState()是用来获取手机SDCard的状态。只有当SDCard挂载时,我们才可以进行写入和读取操作。SDCard状态以及读取关系如下表格:

SD状态现象描述|/mnt/sdcard目录是否存在|canRead返回|canWrite返回|在/mnt/sdcard创建文件|在/mnt/sdcard创建文件夹
:———————- |: ———————————–: | :—————–: |: ——————-: |: ——————————–: |: —
MEDIA_MOUNTED|SD卡正常挂载 |TRUE |TRUE |TRUE |TRUE |TRUE

MEDIA_REMOVED|无介质 |TRUE |FALSE |FALSE |false |FALSE

MEDIA_UNMOUNTED|有介质,未挂载,在系统中删除|TRUE|FALSE|FALSE|false|FALSE

MEDIA_BAD_REMOVAL|介质在挂载前被移除,直接取出SD卡|TRUE|FALSE|FALSE|false|
FALSE

MEDIA_CHECKING|正在磁盘检查,刚装上SD卡时|TRUE|FALSE|FALSE|false|FALSE

MEDIA_SHARED|SD卡存在但没有挂载,并且通过USB大容量存储共享,操作打开USB存储|TRUE|FALSE|FALSE|false: 原因Permission denied
|FALSE

MEDIA_MOUNTED_READ_ONLY|sd卡存在并且已挂载,但是挂载方式为只读|-|-|无法模拟,SD卡不允许修改权限

MEDIA_NOFS|介质存在但是为空白或用在不支持的文件系统|-|-|无法模拟,SD卡格式化后再加载会自动生成系统文件

MEDIA_UNMOUNTABLE |存在SD卡但是不能挂载,例如发生在介质损坏|-|-|无法模拟

通过上表可以看出,只有在SD卡状态为MEDIA_MOUNTED时/mnt/sdcard目录才是可读可写,并且可以创建目录及文件。
所以我们读取SD卡时一般会这么写:

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            String root = Environment.getExternalStorageDirectory().getPath();
            }

读写SD卡记得加这两个权限:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

但是在Android 4.4开始,上面的方法是获取内置SDCard的路径。Environment.isExternalStorageRemovable(),通过此方法我们可以知道手机上的存储卡是手机自带的还是外边可插拔的SD卡,当然此种情况是指只有一个卡的情况。
但是现在国内的大多数手机都支持双存储卡:
下面我总结了一些较常见的外部SD卡的路径:

/mnt/sdcard2 /mnt/sdcard-ext /mnt/ext_sdcard /mnt/sdcard/SD_CARD 
 /mnt/sdcard/extra_sd /mnt/extrasd_bind /mnt/sdcard/ext_sd 
 /mnt/sdcard/external_SD /storage/sdcard1 /storage/extSdCard


用这个方法getVolumePaths,通过反射机制得到路径,然后判断即可。

一些路径的标准写法

Environment.getDataDirectory() = /data 
 Environment.getDownloadCacheDirectory() = /cache 
 Environment.getExternalStorageDirectory() = /mnt/sdcard 
 Environment.getRootDirectory() = /system 
 context.getCacheDir() = /data/data/com.mt.mtpp/cache 
 context.getExternalCacheDir() = /mnt/sdcard/Android/data/com.mt.mtpp/cache 
 context.getFilesDir() = /data/data/com.mt.mtpp/files

增加内容:
写程序时,通常会听到各种不同的路径,比如:相对路径,绝对路径等. 对于 java 文件操作来说,一样有这些路径,在以前 没怎么注意到这个api: getCanonicalPath(), 其实这个东西很重要,因为这个api 是真正能拿到一个文件的唯一路径的api, 它的返回值一定是一个绝对路径.唯一指向一个文件.
当输入为绝对路径时,返回的都是绝对路径。
当输入为相对路径时:
getPath()返回的是File构造方法里的路径,是什么就是什么,不增不减
getAbsolutePath()返回的其实是user.dir+getPath()的内容,从上面返回的结果可以得出。
getCanonicalPath()返回的就是标准的将符号完全解析的路径



参考链接:
http://www.vogella.com/articles/Android/article.html#resources_android

http://www.coreservlets.com/android-tutorial/