Android的外部存储html
Android支持外部存储(case-insensitive filesystem with immutable POSIX permission classes and modes)。java
外部存储能够经过物理介质提供(如SD卡),也能够经过将内部存储中的一部分封装而成,设备能够有多个外部存储实例。android
访问外部存储的权限缓存
从Android 1.0开始,写操做授权限WRITE_EXTERNAL_STORAGE保护。ui
从Android 4.1开始,读操做授权限READ_EXTERNAL_STORAGE保护。htm
从Android 4.4开始,应用能够管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。内存
好比,一个包名为com.example.foo的应用,能够自由访问外存上的Android/data/com.example.foo/目录。get
外部存储对数据提供的保护较少,因此系统不该该存储敏感数据在外部存储上。it
特别地,配置和log文件应该存储在内部存储中,这样它们能够被有效地保护。io
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等。
note:传入的类型参数不能是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 以前的版本要访问须要声明读写权限,若是没有声明权限,上面方法会返回null
与上面两个方法造成对比的是下面两个方法:
getCacheDir()
这两个方法获得的是内存上的目录。
这些目录都是属于应用的,当应用被卸载的时候,里面的内容都会被移除,可是不要依赖于系统的操做。