Android存储访问及目录
Android存储访问及目录
Android的外部存储
Android支持外部存储(case-insensitive filesystem with immutable POSIX permission classes and modes)。
外部存储可以通过物理介质提供(如SD卡),也可以通过将内部存储中的一部分封装而成,设备可以有多个外部存储实例。
访问外部存储的权限
从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。
从Android 4.1开始,读操作受权限READ_EXTERNAL_STORAGE保护。
从Android 4.4开始,应用可以管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。
比如,一个包名为com.example.foo的应用,可以自由访问外存上的Android/data/com.example.foo/目录。
外部存储对数据提供的保护较少,所以系统不应该存储敏感数据在外部存储上。
特别地,配置和log文件应该存储在内部存储中,这样它们可以被有效地保护。
对于多用户的情况,一般每个用户都会有自己独立的外部存储,应用仅对当前用户的外部存储有访问权限。
Environment API的目录
getDataDirectory():用户数据目录。
getDownloadCacheDirectory():下载缓存内容目录。
getExternalStorageDirectory():主要的外部存储目录。
但是这个目录很可能当前不能访问,比如这个目录被用户的PC挂载,或者从设备中移除,或者其他问题发生,你可以通过getExternalStorageState()来获取当前状态。
还有多用户或者多外部存储的情况,此文不再讨论。
为了不污染用户的根命名空间,一般不会直接使用这个外部存储的根目录。
任何应用私有的文件的应该被放置在 Context.getExternalFilesDir返回的目录下,在应用被卸载的时候,系统会清理的就是这个目录。
另一些共享文件应该被放置在 getExternalStoragePublicDirectory(String)返回的目录中。
写这个路径需要 WRITE_EXTERNAL_STORAGE权限,读需要 READ_EXTERNAL_STORAGE权限,当然写权限默认包含了读权限。
从KITKAT 即Android 4.4开始,如果你的应用只是需要存储一些内部数据,可以考虑使用 :
getExternalFilesDir(String)或者getExternalCacheDir(),它们不需要获取权限。
getExternalStoragePublicDirectory(String type)这个方法接收一个参数,表明目录所放的文件的类型,传入的参数是Environment类中的DIRECTORY_XXX静态变量,比如DIRECTORY_DCIM等。
注意:传入的类型参数不能是null,返回的目录路径有可能不存在,所以必须在使用之前确认一下,比如使用File.mkdirs创建该路径。
getRootDirectory()得到Android的根目录。
isExternalStorageEmulated()设备的外存是否是用内存模拟的,是则返回true。(API Level 11)
isExternalStorageRemovable()设备的外存是否是可以拆卸的,比如SD卡,是则返回true。(API Level 9)
Context API中的目录
getExternalFilesDir(String type)是应用在外部存储上的目录。
和Environment类的getExternalStoragePublicDirectory(String type)方法类似,返回包含参数指定的特定类型文件的子目录。
getExternalCacheDir()是应用的在外部存储上的缓存目录。
从Android 4.4这两个方法不需要读写权限,是针对于本应用来说,如果要访问其他应用的相关目录,还是需要声明读写权限。
Android 4.4之前的版本要访问的话还是要声明读写权限的,如果没有在manifest中写权限,上面两个get方法都会返回null。
与上面两个方法形成对比的是下面两个方法:
这两个方法得到的是内存上的目录。
这些目录都是属于应用的,当应用被卸载的时候,里面的内容都会被移除,但是不要依赖于系统的操作。
测试代码
package com.mengdd.utils.android; import android.content.Context;
import android.os.Environment; public class DirectoryUtils { private static final String LOG_TAG = "DirectoryUtils"; public static void getEnvironmentDirectories() {
LogUtils.i(LOG_TAG, "getRootDirectory(): "
+ Environment.getRootDirectory().toString());
LogUtils.i(LOG_TAG, "getDataDirectory(): "
+ Environment.getDataDirectory().toString());
LogUtils.i(LOG_TAG, "getDownloadCacheDirectory(): "
+ Environment.getDownloadCacheDirectory().toString());
LogUtils.i(LOG_TAG, "getExternalStorageDirectory(): "
+ Environment.getExternalStorageDirectory().toString()); LogUtils.i(
LOG_TAG,
"getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES): "
+ Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).toString()); // LogUtils.i(
// LOG_TAG,
// "isExternalStorageEmulated(): "
// + Environment.isExternalStorageEmulated());
//
// LogUtils.i(
// LOG_TAG,
// "isExternalStorageRemovable(): "
// + Environment.isExternalStorageRemovable()); } public static void getApplicationDirectories(Context context) { LogUtils.i(LOG_TAG, "context.getFilesDir(): "
+ context.getFilesDir().toString());
LogUtils.i(LOG_TAG, "context.getCacheDir(): "
+ context.getCacheDir().toString()); // methods below will return null if the permissions denied
LogUtils.i(
LOG_TAG,
"context.getExternalFilesDir(Environment.DIRECTORY_MOVIES): "
+ context
.getExternalFilesDir(Environment.DIRECTORY_MOVIES)); LogUtils.i(
LOG_TAG,
"context.getExternalCacheDir(): "
+ context.getExternalCacheDir());
}
}
在MI 2S上输出Log:

在三星S5660上(API Level 9,注释掉了两个方法):

参考资料
android.os.Environment
http://developer.android.com/reference/android/os/Environment.html
External Storage Technical Information
http://source.android.com/devices/tech/storage/
Context
http://developer.android.com/reference/android/content/Context.html
Android存储访问及目录的更多相关文章
- android的Environment类 Android存储访问及目录
http://www.cnblogs.com/mengdd/p/3742623.html http://blog.csdn.net/barnett_zhubo/article/details/6832 ...
- 一篇文章搞懂android存储目录结构
前言 前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了内部存储目录(测试手机为小米,路径为:data/user/0/packagename/files)下面,然后安装的时候一直安 ...
- android访问asset目录下的资源
android提供了AssetManager来访问asset目录下的资源, 在activity中通过getAssets()获取AssetManager 常用的api如下: 1.列举路径下的资源Stri ...
- android源码的目录结构
android源码的目录结构 [以下网络摘抄] |-- Makefile ! l/ a5 n% S% @- `0 d# z# a$ P4 V3 o7 R|-- bionic ...
- Android 2.1 和 Android 4.4 工程目录超详细对比及详解
在搭建Android开发环境及简单地建立一个HelloWorld项目后,本篇将通过HelloWorld项目来介绍Android项目的目录结构.本文的主要主题如下: 1.1.HelloWorld项目的目 ...
- Android之访问下载文件
1.SD卡操作类 FileUtils.java package com.example.mars_1500_download; import java.io.File; import java.io. ...
- 有关Android存储的相关概念辨析
我想念许多Android开发人员在碰到有关存储的相关问题时,肯定遇到过“内部存储/内存”.“外部存储/外存”等类似的概念,尤其是将相关概念跟非开发人员解释时,那真是“秀才遇到兵,有理说不清哪”.包括我 ...
- Android存储扩展学习-----应用的清除数据和清除缓存
前几天和朋友聊到了APP清除数据这块,聊到了清除数据都会清掉哪些数据,我们每个人的手机在”设置–>应用管理”里面,选择任意一个App,都会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我 ...
- Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)
本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...
随机推荐
- 实战:微信小程序支付开发具体流程
来源:授权地址作者:会编码的熊 该文章纪录了我在开发小程序支付过程中的具体流程 1. 申请微信支付 小程序认证后进入微信支付申请小程序的微信支付 填写企业信息对公账户并上传凭证后,微信支付会打一笔随机 ...
- 【Android】Camera 使用浅析
Camera的简单使用浅析 由于最近工作上用到android.hardware.Camera这个类,于是简单的学习了一些基本用法. 首先注意:Camera这个类在API21以后就不推荐使用了,官方提供 ...
- Windows Azure Cloud Service (10) Role的生命周期
<Windows Azure Platform 系列文章目录> 在上一章内容中,我们提到了Windows Azure会依次调用角色(Role)实例的OnStart()方法和Run()方法. ...
- openjudge7834:分成互质组 解析报告
7834:分成互质组 总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个正整数,将它们分组,使得每组中任意两个数互质.至少要分成多少个组? 输入 第一行是一个正整数n.1 &l ...
- [AngularJS] AngularJS系列(2) 中级篇之路由
目录 原理 angular-route ui-router 事件 深度路由 原理 ng的route本质是监听hashchange事件. 在angular-route中 $rootScope.$on(' ...
- Type 'Insus.NET.PictureObject' in Assembly 'App_Code, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
昨晚想实现一个功能,需要把一个对象存储于ViewState中去,但在运行时,出现下面的异常. Type 'Insus.NET.PictureObject' in Assembly 'App_Code, ...
- Java泛型-类型擦除
一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...
- 目标平台、活动平台 配置,出现未能加载文件或程序集“xxx”或它的某一个依赖项报错
今天在做动态加载程序集的时候,发现明明程序集存在的情况下,还是依然报“未能加载文件或程序集“xxx”或它的某一个依赖项报错”的错误,排除了程序和配置的错误后,怀疑是否是环境的问题,于是百度加msdn后 ...
- Android开发常见错误及技巧
1.无法使用网络:Permission denied(maybe missing internet permission) 在AndroidMainifest.xml中增加允许使用网络选项(在< ...
- Eclipse设置风格
如果觉得Eclipse的颜色太刺眼,可以修改背景与字体颜色,方法如下: (1)到http://eclipsecolorthemes.org/下载主题文件,可以选择xml文件或者epf文件: (2)Ec ...