Environment.getExternalStorageState介绍

如果我们想要读取或者向SD卡写入,这时就必须先要判断一个SD卡的状态,否则有可能出错。
那么SD卡状态为什么时才能读取呢,经过我的各种情况的实践,大致如下:
SD状态
现象描述
/mnt/sdcard目录是否存在
canRead返回
canWrite返回
在/mnt/sdcard创建文件
在/mnt/sdcard创建文件夹
MEDIA_MOUNTED
SD卡正常挂载
TRUE
TRUE
TRUE
TRUE
TRUE
MEDIA_REMOVED
无介质
TRUE
FALSE
FALSE
false:    原因Permission denied
FALSE
MEDIA_UNMOUNTED
有介质,未挂载,在系统中删除
TRUE
FALSE
FALSE
false:    原因Permission denied
FALSE
MEDIA_BAD_REMOVAL
介质在挂载前被移除,直接取出SD卡
TRUE
FALSE
FALSE
false:    原因Permission denied
FALSE
MEDIA_CHECKING
正在磁盘检查,刚装上SD卡时
TRUE
FALSE
FALSE
false:    原因Permission denied
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卡时一般会这么写:
?
代码片段,双击复制
01
02
03
04
05
06
String state;
String path;
state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)){
path =Environment.getExternalStorageDirectory().getAbsolutePath();

读写SD卡记得加这两个权限:
?
代码片段,双击复制
01
02
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    "android.permission.WRITE_EXTERNAL_STORAGE"/>
1 在AndroidManifest文件中加入sdcard操作权限
  * 
  *  
  *  
  *  
* 2 确认sdcard的存在
  * android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)
* 3 获取扩展存储设备的文件目录
  * android.os.Environment.getExternalStorageDirectory();




1 通过Java IO库读写文件

当我们想读写公用的目录,如图片、提示音;或者读写外部扩展卡上的文件时,一般都选择通过Java IO库去读写。当通过Java IO库去读写文件时,一般会用到Android Enviroment的接口(如读取外部sdcard的路径、状态等)。

 

1.1 Android Enviroment

下面分别对Android Eviroment涉及到的函数和变量进行说明

 表01_ Enviroment API接口

Enviroment API接口

API名称

说明

staticFile getDataDirectory()

获取Android的数据目录。

staticFile getDownloadCacheDirectory()

获取的Andr​​oid下载/缓存内容的目录。

staticFile getExternalStorageDirectory()

获取Android的外部存储目录(即sdcard目录)。

staticFile getExternalStoragePublicDirectory(String type)

获取为特定类型的文件放在顶层的公共外部存储目录。

staticString getExternalStorageState()

获取的主要外部存储设备的当前状态(即sdcard目录的状态)。

staticFile getRootDirectory()

获取Android的根目录。

static boolean isExternalStorageEmulated()

返回设备是否有外部存储设备的仿真。

static boolean isExternalStorageRemovable()

返回主“外部存储设备是否是可拆卸的。

 

表02_Enviroment sdcard卡状态说明

Enviroment 公用目录参数

类型

名称

说明

public static String

DIRECTORY_ALARMS

标准的铃声目录

public static String

DIRECTORY_DCIM

相机拍照或录像文件的存储目录

public static String

DIRECTORY_DOWNLOADS

下载目录

public static String

DIRECTORY_MOVIES

电影目录

public static String

DIRECTORY_MUSIC

音乐目录

public static String

DIRECTORY_NOTIFICATIONS

提示音目录

public static String

DIRECTORY_PICTURES

图片目录

public static String

DIRECTORY_PODCASTS

播客目录

public static String

DIRECTORY_RINGTONES

铃声目录

 

表03_ Enviroment sdcard卡状态说明

Enviroment sdcard卡状态说明

状态名称

说明

MEDIA_BAD_REMOVAL

非法移除状态:移除sdcard之前,没有卸载sdcard。

MEDIA_CHECKING

检查状态:检查sdcard的有效性

MEDIA_MOUNTED

挂载状态:sdcard卡已经成功挂载。

MEDIA_MOUNTED_READ_ONLY

只读状态:sdcard已经挂载,但是是只读的。

MEDIA_NOFS

NOFS状态:识别到sdcard卡,但无法挂载。无法挂载原因,可能是sdcard无存储介质,或者sdcard卡的文件系统与android无兼容。

MEDIA_REMOVED

移除状态:sdcard成功移除。

MEDIA_SHARED

共享状态:识别到sdcard卡,但sdcard未挂载,而是作为mass storage等设备(如以u盘的方式连接到电脑上)。

MEDIA_UNMOUNTABLE

无法挂载状态:识别到sdcard卡,但无法挂载。无法挂载的原因,可能是sdcard的存储介质部分损坏。

MEDIA_UNMOUNTED

未挂载:识别到sdcard,但没有挂载。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值