Android-存储路径与管理应用文件存储方法汇总
Android手机存储分为两个部分:内部存储和外部存储,内部存储一般是手机自带的存储空间,外部存储指外插SD卡提供的存储空间;随着手机发展,这两个存储的定义又有了一些些变化,新的手机不再有外插SD卡的概念,采取了内置闪存(EMMC、UFS等)的方式,所以内部存储和外部存储在新的Android手机上已经在同一个硬件上了。
1.1、获取与应用相关的文件目录--Context
mContext.getCacheDir() /data/user/0/package name/cache
mContext.getDir("spanner",MODE_PRIVATE) /data/user/0/package name/app_spanner
mContext.getFileDir() /data/user/0/package name/files
mContext.getExternalCacheDir() /storage/emulated/0/Android/data/package name/cache
mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
/storage/emulated/0/Android/data/package name/files/Pictures
mContext.getExternalFilesDir(null) /storage/emulated/0/Android/data/package name/files
mContext.getExternalMediaDirs() /storage/emulated/0/Android/media/package name/
注意:/data/user/0/ 等同于 /data/data/;内部存储在其他应用和用户(文件管理器)无法直接访问
1.2、获取公有存储位置的文件目录--Environment
与应用相关的为私有目录,Android还定义了一些如下的公有目录
public static final String[] STANDARD_DIRECTORIES = {
DIRECTORY_MUSIC,
DIRECTORY_PODCASTS,
DIRECTORY_RINGTONES,
DIRECTORY_ALARMS,
DIRECTORY_NOTIFICATIONS,
DIRECTORY_PICTURES,
DIRECTORY_MOVIES,
DIRECTORY_DOWNLOADS,
DIRECTORY_DCIM,
DIRECTORY_DOCUMENTS
};
//获取方式
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
/storage/emulated/0/DCIM
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
/storage/emulated/0/Pictures
......
公有目录可通过getExternalStoragePublicDirectory获取,如果该目录不存在,调用时会自动生成该目录。
1.3、其它系统目录
Environment.getExternalStorageDirectory() /storage/emulated/0
Environment.getDataDirectory() /data
Environment.getDownloadCacheDirectory() /data/cache
Environment.getRootDirectory() /system
二、存储策略
2.1、内部存储---内部存储的文件夹其他应用和用户无法直接访问,可以用于存放敏感数据。
2.1.1、getCacheDir()---专门用于存放缓存数据。用户对app进行缓存清理的时候会清理缓存目录cache的数据,手机空间不足的时候系统也会对缓存目录内的数据进行清理。但尽管如此,开发者仍要管理好缓存数据特别是内部存储的缓存,避免缓存数据过大。
2.1.2、getFileDir()---可用于用于存放私有持久文件。非常适合用于存放app各种伴随app运行周期所需要的文件数据,它既不会因为手机存储空间不足而被清理,也不会因卸载app而遗留数据垃圾,并且它是私有的。
2.1.3、getDir(String name,int mode)---归类存放私有文件。在内部私有目录下会创建一个名为name的文件夹,mode以前是可以设置文件夹私有(MODE_PRIVATE)和公有的(MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE),但目前公有的mode都已经废弃,意味着这个api创建的文件夹已经完全私有,不能再共享出去了。
2.2、外部存储---使用外部存储之前一定要检查外部存储是否可用,因为旧设备不一定会有外部存储,新设备需要动态申请权限不一定可以使用。
public static boolean isSDCardEnable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
另外,需要声明权限(android.Manifest.permission#WRITE_EXTERNAL_STORAGE android.Manifest.permission#READ_EXTERNAL_STORAGE)
2.2.1、getExternalCacheDir()---专门用于存放缓存数据。和内部存储的getCacheDir()相似。
2.2.2、getExternalFilesDir(String type)---归类存放公有文件。如果type不为null的话在外部私有目录下创建返回一个名为type的文件夹,为null直接返回外部私有根目录。如无特别需要,个人的做法是传入Environment的DIRECTORY常量进行文件夹创建。
2.2.3、getExternalMediaDirs()---可存放共享媒体文件。这个是在Android 5.0加入的api,创建和获取位于/sdcard/Android/media目录下的应用目录,该目录下的文件能够被其他应用访问和被MediaStore查询和获取。但目前较少开发者在使用这个api。
2.3、公有目录--获取公有目录要使用Environment的Api,它返回的目录全都是共享的公有目录。造成Android手机文件存储混乱的罪魁祸首!
2.3.1、getExternalStorageDirectory()---获取外部存储(SD卡)的根目录。使用getExternalStoragePublicDirectory(String)进行替代即可。
2.3.2、getExternalStoragePublicDirectory(String type)
使用频率极高的api,返回在根目录下的名为type的文件夹,我把它分为两种用法:一种是传入Environment的DIRECTORY常量再创建子目录使用;一种是传入appPackageName或者易被识别归属的名称创建子目录使用。前者会比较通用,内容可以被各种工具app搜索发现(包括微信);后者算是私用,可以存放不跟随app生命的文件,即卸载后也可以保留。
Environment.DIRECTORY_DCIM是手机的相册,这个文件夹都是系统相关的app在用,存放相机拍摄的图片,手机截图之类的,不推荐开发者使用这个文件夹,避免混乱。值得一提的是淘宝有在使用这个文件夹,用于保存它的商品分享截图,这个位置的确可以避免被微信封杀
Environment.DIRECTORY_PICTURES用于存放各种“正式的”图片,强烈建议在这里创建文件夹存放你想要被用户发现的图片,并且微信会扫描这个文件夹,让你的图片更容易分享。
Environment.DIRECTORY_DOWNLOADS可以用于存放app更新的apk等下载资源。
2.4、获取文件路径这件事永远不能写死某个路径,因为设备可能不存在SD卡,或者不同平台的外部存储挂载路径是不相同的,所以管理文件的时候必须要有存储策略。比如尽量用Android标准的接口获取目录;比如一个文件的保存地址获取方法里不能只有一个api,要保有兜底措施,如果我不能存在外部储存,那我就存在内部,保证app的功能正常运行。
作者:STU_11wxzou
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341