Android应用开发中,常使用Environment类去获取外部存储目录,在访问外部存储之前一定要先判断外部存储是否已经是可使用(已挂载&可使用)状态,
并且需要在AndroidManifest.xml文件中添加外部存储读和写的权限。
  Environment类中提供了几个静态常量用于标识外部存储的状态,这些状态都是String类型直接使用equals()判断即可!

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卡时一般会这么写:只有满足条件时:才在if与具体里面执行特定的逻辑:比如下载图片到SD卡:

 String state;
String path;
state = Environment.getExternalStorageState();
if(state.equals(Environment.MEDIA_MOUNTED)){
path =Environment.getExternalStorageDirectory().getAbsolutePath();

下面是Android重的一段代码。主要是示例Environment检测sdcard状态的应用!
         // 使用http协议下载图片
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(path);
HttpResponse response = null;
// 获取SDcard的目录
File file = Environment.getExternalStorageDirectory();
FileOutputStream outputStream = null; // 这是方便在后面关闭IO流
try {
response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {
// 将获得的资源放入字节数组中
byte[] result = EntityUtils.toByteArray(response.getEntity());
// 将数据写入到SD卡上面的指定名字的文件里面,首先创建一个文件
// 同时需要判断如果SD卡是在挂载的状态吗,那么OK可以写了
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { }
File new_file = new File(file, "x.jpg");
outputStream = new FileOutputStream(new_file);
outputStream.write(result, 0, result.length);
} } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
try {
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 //这两个配置文件中的状态是不可少的,要向支持连接网络还需要网络允许
<uses-permission Android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>

在Environment中还提供了Android标准目录的路径,以String类型提供。
DIRECTORY_ALARMS 系统提醒铃声存放的标准目录。
DIRECTORY_DCIM 相机拍摄照片和视频的标准目录。
DIRECTORY_DOWNLOADS 下载的标准目录。
DIRECTORY_MOVIES 电影存放的标准目录。
DIRECTORY_MUSIC 音乐存放的标准目录。
DIRECTORY_NOTIFICATIONS 系统通知铃声存放的标准目录。
DIRECTORY_PICTURES 图片存放的标准目录
DIRECTORY_PODCASTS 系统广播存放的标准目录。
DIRECTORY_RINGTONES 系统铃声存放的标准目录。

static File getDataDirectory() 获得data的目录(/data)。
static File getDownloadCacheDirectory() 获得下载缓存目录。(/cache)
static File getExternalStorageDirectory() 获得外部存储媒体目录。(/mnt/sdcard or /storage/sdcard0)
static File getRootDirectory() 获得系统主目录(/system)

除了用Environment获取存储目录之外,还可以通过把路径写死的方式,比如要读取外部存储/mnt/sdcard目录下的文件,可以在程序中直接用全路径,
但是这样做是很不好的,应该Android实在是太开放了,外部存储的目录的什么还是要固件制作商才知道,但是有一点是毋庸置疑的,就是Android框架层里面
已经是指定好了Environment.getDownloadCacheDirectory()的返回路径。所以,尽量用这种方式来获取和存储数据,以免固件厂商不同而造成路径的差异。

Android的实际开发中还用了两个非常重要的缓存目录,一个是应用程序自己的缓存空间,另一个是外部存储为该应该程序提供的缓存空间。有什么差别?
使用过LruCache和DisLruCache的童鞋应该知道。
这两个方法是通过上下文对象Context获取的,只要应用程序被卸载,这两个目录下的文件都要被清空。
context.getCacheDir() 获取应用程序自己的缓存目录
context.getExternalCacheDir() 获取应用程序在外部存储的存储目录

参考了:http://blog.csdn.net/yuzhiboyi/article/details/8645730

    http://www.kuqin.com/shuoit/20141130/343550.html  

Environment中针对的读写权限判断的更多相关文章

  1. ubuntu 中 mongodb 数据读写权限配置

    首先,我们先对mongodb 数据库的权限做一点说明: 1 默认情况下,mongodb 没有管理员账号 2 只有在 admin 数据库中才能添加管理员账号并开启权限 3 用户只能在所在的数据库中登录, ...

  2. iOS 权限判断 跳转对应设置界面

    相机权限 1.1 使用说明 在合适的地方导入#import <AVFoundation/AVFoundation.h> 使用AVAuthorizationStatus类获取当前权限状态 在 ...

  3. android应用中增加权限判断

    android6.0系统允许用户管理应用权限,可以关闭/打开权限. 所以需要在APP中增加权限判断,以免用户关闭相应权限后,APP运行异常. 以MMS为例,在系统设置——应用——MMS——权限——&g ...

  4. NFine中权限判断出错的问题

    NFine中权限判断出错的问题 问题描述:登录后点击栏目一,弹出了窗口一,再点击栏目二,弹出了窗口二,然后再点击窗口一,再执行窗口一中的操作时,发现已没有任何权限,调试后发现在HandlerAutho ...

  5. MongoDB3.x中添加用户和权限控制

    现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限.注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth) ? 1 2 3 4 5 6 7 8 9 10 ...

  6. Android sdcard读写权限问题之中的一个

    博主在刚刚在学习过程中发现了一个关于android往sdcard读写的问题, 配置了该配置的提示无读写权限. 在AndroidManifest.xml文件里配置清单例如以下 <manifest ...

  7. 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题

    快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题 转 https://www.jb51.net/article/144939.htm 今天小编就为大家分享一篇快速解决设置And ...

  8. axios实现类似form传值的格式,以及实现拦截器功能,response拦截实现权限判断

    import axios from 'axios' import Qs from 'qs' // 超时设置 const service = axios.create({ transformReques ...

  9. 实现ABP中Person类的权限功能

    菜单项的显示功能已经完全OK了.那么我们就开始制作视图功能吧. 首先测试接口是否正常 我们通过代码生成器将权限和application中大部分功能已经实现了.那么我们来测试下这些接口ok不. 浏览/a ...

随机推荐

  1. Linux命令行–走进shell

    在现代Linux系统上,当Linux系统启动时它会创建几个虚拟控制台.虚拟控制台是运行在Linux系统内存中的一个终端会话.大部分Linux发行版会启动7个(有时更多)虚拟控制台.通常按下Ctrl+A ...

  2. 美国大学排名之本科中最用功的学校top15

    美国大学排名之本科中最用功的学校top15 威久留学2016-07-29 13:15:59美国留学 留学新闻 留学选校阅读(490)评论(1)   去美国留学的同学可能都知道USnews美国大学排名, ...

  3. 多大开始玩EV3

    机器人EV3还是初中生才能玩的溜 耐撕爸爸推荐年龄:初中及以上 推荐理由:无需使用计算机就可进行编程,培养孩子的编程.机械.电子.物理等综合能力. 在欧美等国家,乐高机器人融入教学已成为一种普遍现象, ...

  4. [BS-11] 关于RGB/ARGB颜色相关知识

    关于RGB/ARGB颜色相关知识 众所周知,自然界的颜色都是由红色R.绿色G.蓝色B三元色按不同比例混合而成,每种元色取值范围是0-255.iOS中图片的颜色分为2种:24位和32位. 1. 24位( ...

  5. CentOS 6.6 yum 搭建LAMP环境

    CentOS 查看操作系统版本 [root@oa ~]# cat /etc/redhat-releaseCentOS release 6.6 (Final) 参考linux centos yum安装L ...

  6. gcc常用

    gcc选项:-I指定头文件搜索路径.-D编译时定义宏-L链接时指定库文件搜索路径-l指定库文件名称-pipe使用管道,一个程序的输出作为输入直接送给另外一个程序, 而且还可以一直连续下去,不需要临时文 ...

  7. python_字符串

    1. 字符串的格式化 格式: 说明: (1)转换说明符 (2)格式化操作符右操作数可以是任何东西,如果是元组的话,每一个元素都会被单独格式化. 2. 字符串常用的方法 (1)find int = fi ...

  8. MongoDB时间类型

    mongdb时间类型 Date() 显示当前的时间 new Date 构建一个格林尼治时间   可以看到正好和Date()相差8小时,我们是+8时区,也就是时差相差8,所以+8小时就是系统当前时间 I ...

  9. 关于StdAfx.h和StdAfx.cpp

    http://www.cplusplus.com/articles/2z86b7Xj/ https://msdn.microsoft.com/en-us/library/h552b3ca.aspx h ...

  10. JSON 字符串 与 java 对象的转换

    jsonLib 经典文章:http://json-lib.sourceforge.net/xref-test/net/sf/json/TestJSONObject.html // 引入相应的包 //j ...