那么SD卡状态为什么时才能读取呢,经过我的各种情况的实践,大致如下:
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:
|
FALSE
| |
MEDIA_MOUNTED_READ_ONLY |
sd卡存在并且已挂载,但是挂载方式为只读
|
-
|
-
| 无法模拟,SD卡不允许修改权限 | |||
MEDIA_NOFS |
介质存在但是为空白或用在不支持的文件系统
|
-
|
-
| 无法模拟,SD卡格式化后再加载会自动生成系统文件 | |||
MEDIA_UNMOUNTABLE |
存在SD卡但是不能挂载,例如发生在介质损坏
|
-
|
-
| 无法模拟 |
通过上表可以看出,只有在SD卡状态为 MEDIA_MOUNTED 时/mnt/sdcard目录才是可读可写,并且可以创建目录及文件。
所以我们读取SD卡时一般会这么写:
01
02
03
04
05
06
|
String state;
String path;
state = Environment.getExternalStorageState();
if
(state.equals(Environment.MEDIA_MOUNTED)){
path =Environment.getExternalStorageDirect
}
读写SD卡记得加这两个权限:
*
|
Enviroment API接口 | |
API名称 | 说明 |
staticFile | 获取Android的数据目录。 |
staticFile | 获取的Android下载/缓存内容的目录。 |
staticFile | 获取Android的外部存储目录(即sdcard目录)。 |
staticFile | 获取为特定类型的文件放在顶层的公共外部存储目录。 |
staticString | 获取的主要外部存储设备的当前状态(即sdcard目录的状态)。 |
staticFile | 获取Android的根目录。 |
返回设备是否有外部存储设备的仿真。 | |
返回主“外部存储设备是否是可拆卸的。 |
表02_Enviroment sdcard卡状态说明
Enviroment 公用目录参数 | ||
类型 | 名称 | 说明 |
标准的铃声目录 | ||
相机拍照或录像文件的存储目录 | ||
下载目录 | ||
电影目录 | ||
音乐目录 | ||
提示音目录 | ||
图片目录 | ||
播客目录 | ||
铃声目录 |
表03_ Enviroment sdcard卡状态说明
Enviroment sdcard卡状态说明 | |
状态名称 | 说明 |
非法移除状态:移除sdcard之前,没有卸载sdcard。 | |
检查状态:检查sdcard的有效性 | |
挂载状态:sdcard卡已经成功挂载。 | |
只读状态:sdcard已经挂载,但是是只读的。 | |
NOFS状态:识别到sdcard卡,但无法挂载。无法挂载原因,可能是sdcard无存储介质,或者sdcard卡的文件系统与android无兼容。 | |
移除状态:sdcard成功移除。 | |
共享状态:识别到sdcard卡,但sdcard未挂载,而是作为mass storage等设备(如以u盘的方式连接到电脑上)。 | |
无法挂载状态:识别到sdcard卡,但无法挂载。无法挂载的原因,可能是sdcard的存储介质部分损坏。 | |
未挂载:识别到sdcard,但没有挂载。 |