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。
与上面两个方法形成对比的是下面两个方法:
getFilesDir()
getCacheDir()
这两个方法得到的是内存上的目录。
这些目录都是属于应用的,当应用被卸载的时候,里面的内容都会被移除,但是不要依赖于系统的操作。
测试代码
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存储访问框架的使用
存储访问框架,简称:SAF, 就是系统文件选择器+文件操作API.先选择文件,在用文件操作API处理文件.系统文件选择器,就和Windows的文件选择框一样. 其实绝大多数app,都不会使用这个东西, ...
- android文件存储框架,Android 存储访问框架|undefined
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android 4.4(API 级别 19)引入了存储访问框架 (SAF).SAF 让用户能够在其所有首选文档存储提供程 ...
- Android实现Mtp访问浏览手机存储(一)访问Mtp目录
MTP,全称是 Media Transfer Protocol(媒体传输协议),它是微软的一个为计算机和便携式设备之间传输图像.音乐等所定制的协议.MTP 的应用分两种角色,一个是作为 Initiat ...
- android获取文件上级目录,Android 文件存储
Android 存储位置及 API 一.内部存储 应用安装后都会在Android 根目录生成 /data/data/packagename,当前应用读取不需要读写权限 注意: 有些开发者可能看到过应用 ...
- Android Q访问公共外部存储受限
一.前言 从Android Q(即 Android 10)开始,应用访问外部存储的私有目录(即Context.getExternalFilesDir())不需要申请READ_EXTERNAL_STOR ...
- android SAF存储访问框架
Android 4.4(API 级别 19)引入了Storage Access Framework存储访问框架 (SAF),SAF 让用户能够在其所有首选文档存储提供程序中方便地浏览并打开文档.图像以 ...
- Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)
文章大纲 引言 一.Android Storage Access Framework 二.Storage Access Framework 的主要角色成员 1.Document Provider 文件 ...
- Android内部存储与外部存储(私有目录与公共目录)图文详解
目录 一.存储空间概述 二.存储空间的划分 1.存储划分 2.内部存储 2.1 内部存储概述 2.2 内部存储 - 私有目录 3. 外部存储 3.1 外部存储概述 3.2 外部存储 - 私有目录 3. ...
- android访问asset目录下的资源
android提供了AssetManager来访问asset目录下的资源, 在activity中通过getAssets()获取AssetManager 常用的api如下: 1.列举路径下的资源Stri ...
最新文章
- 好程序员web前端分享Nodejs学习笔记之Stream模块
- Oracle12c功能增强 新特性之管理功能的增强
- 在C/C++代码中使用SSE等指令集的指令(1)介绍
- 个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能...
- day14——内置函数
- Windows Server 2008 R2终端服务器远程授权激活
- java变量和方法的覆盖和隐藏(翻译自Java Tutorials)
- Windows下FireFox插件dll文件名,必须是np开头,不能是plugin结尾
- android多屏互动方案,基于Android的DLNA多屏互动系统的设计与开发
- Open vSwitch: Provider 网络
- pano2vr无法输出html5,教大家Pano2VR怎么输出全景图的方法
- 区别python中list()和tolist()的区别
- 头像框DIY制作小程序源码王者吃鸡等气泡头像框在线生成源码
- 解决树莓派中文显示框框乱码
- Windows7旗舰版SP1_64位2018.10(装机版)
- win10资源管理器频繁重启可能原因及解决方案
- graphpad prism怎么添加图例_Graphpad Prism 绘制散点图详细图解
- 3.Tom猫的实现(帧动画播放)
- 坐的越久,死的越快——说说工作环境
- performance的使用
热门文章
- springcloud都有什么组件?这个列表不得不看!
- 《系统集成项目管理》第十三章 项目合同管理
- java excel jxls_java通过jxls框架实现导入导出excel文件实例
- ise 时钟约束_「新手入门」ISE工程升级到Vivado及板级信号调试技术
- 海外观察丨未来 10 大科技趋势预测全解读(上)
- 数字化在金融领域的应用与实践,从“我觉得”到“用户觉得”
- 神策分析 1.16 版本上线场景库,实操方法论融入产品,全方位赋能多角色应用...
- 揭秘:神策数据产品矩阵,全方位筑就你的数据驱动闭环
- 喜报!在行签约神策数据
- git 工作流和git commit规范