前言
前两天因为一个更新的能,我将从的apk文件放在了内部存储目录(手机为小米,路径为:data/user/0/packagename/fi)下面,然后安装的时候一直安装不了,提示解析包出错。后来查询发现,安装apk是调用了PackageInstaller,没有相关权限,这个无法获取内部路径,所以会安装不了。借机也复了一遍Andid下面存储相关的知识点,总结一番。
存储分类
对于Andid存储目录,我总结成一张思维导。上面这张很清楚的展示了Andid存储的目录,接下来我们详细每一个目录。
- 内部存储
内部存储位于中很特殊的一个位置,对于设备中每一个安装的 App,都会在 data/data/packagename/ 自动创建与之对应的文件夹。如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。对于这个内部目录,用户是无法访问的,除非获取ot权限。
Stng fileDir = .getAbsolutePath; Stng cacheDir = .getAbsolutePath;
一般情况下,我们获取到的路径为data/data/packagename/,小米手机下面打印出来的结果如下:
对于内部存储路径,我们一般通过以下两种方式获取,内部存储空间的获取都需要使用Context:
对应内部存储的路径为: data/data/packagename/fi,但是对于有的手机如:华为,小米等获取到的路径为:data/user/0/packagename/fi
对应内部存储的路径为: data/data/packagename/cache,但是对于有的手机如:华为,小米等获取到的路径为:data/user/0/packagename/cache应用程序的缓存目录,该目录内的文件在设备内存不足时会优先被删除掉,所以存放在这里的文件是没有保障的,可能会丢掉。
- 外部存储
针对于外部存储比较容易混淆,因为在Andid4.4以前,手机机身存储就叫内部存储,入的SD卡就是外部存储,但是在Andid4.4以后的话,就目前而言,现在的手机自带的存储就很大,现在Andid10.0的话,有的手机能达到256G的存储,针对于这种情况,手机机身自带的存储也是外部存储,如果再入SD卡的话也叫外部存储,因此对于外部存储分为两部分:SD卡和扩展卡内存
我们通过一段代码来获取手机的外部存储目录,我们用的手机是三星G4,带有入SD卡的:
if (>= ) { File fi = getExternalFiDirs; for (File file : fi) { ("file_dir", ); } }
对于以上代码,打印的结果如下:
打印出两行目录,第一行目录是机身自带的外部存储目录,目录结构为:/storage/emulated/0/Andid/data/packagename/fi 第二行是存储卡的目录结构,路径为:/storage/extSdCard/Andid/data/packagename/fi
扩展外部存储
此目录路径需要通过context来获取,同时在卸载之后,这些文件也会被删除。类似于内部存储。
getExternalCacheDir
对应外部存储路径:/storage/emulated/0/Andid/data/packagename/cache
getExternalFiDir(Stng type)
对应外部存储路径:/storage/emulated/0/Andid/data/packagename/fi
SD卡存储
SD卡里面的文件是可以被访问,即文件的数据对应用或者用户来说都是可以访问的,当应用被卸载之后,其卸载前创建的文件仍然保留。
对于SD卡上面的文件路径需要通过Envinment获取,同时在获取前需要判断SD的状态:
MEDIA_UNKNOWN SD卡未知MEDIA_REMOVED SD卡移除MEDIA_UNMOUNTED SD卡未安装MEDIA_CHECKING SD卡中,刚装上SD卡时MEDIA_NOFS SD卡为空白或正在使用不受支持的文件MEDIA_MOUNTED SD卡安装MEDIA_MOUNTED_READ_ON SD卡安装但是只读MEDIA_SHARED SD卡MEDIA_BAD_REMOVAL SD卡移除错误MEDIA_UNMOUN 存在SD卡但是不能挂载,例如发生在介质损坏
Stng externalStorageState = ; if { //sd卡已经安装,可以进行相关文件操作 }
getExternalStorageDirectory
对应外部存储路径:/storage/emulated/0
getExternalStoragePublicDirectory(Stng type)
获取外部存储的文件夹路径如:
DIRECTORY_MUSIC 音乐目录DIRECTORY_PICTES 片目录DIRECTORY_MOVIES 目录DIRECTORY_DOWNLOADS 目录DIRECTORY_DCIM 相机拍照或录像文件的存储目录DIRECTORY_DOCUMENTS 文件文档目录
Stng externalStoragePublicDirectory = .getPath;
以上便是获取相机DCIM目录,对应获取的路径为:/storage/emulated/0/DCIM。
- 存储目录
getRootDirectory
对应获取分区根路径:/
getDataDirectory
对应获取用户数据目录路径:/data
getDownloadCacheDirectory
对应获取用户缓存目录路径:/cache
相关概念区别
- getFileDir和getCacheDir区别
这两个都位于内部存储目录/data/data/packagename/下面,位于同别,前者是file目录下面,后面是cache目录下。
- getFileDir和getExternalFiDir(Stng type)区别
前者位于内部存储目录/data/data/packagename/file下面,后者位于外部存储目录/storage/emulated/0/Andid/data/packagename/fi下面,它们都存在于应用包名下面,也就是说属于应用的,所以当卸载后,它们也会被删除的。
对于前面提到的级能,我们从端的需要放到外部存储目录下面,而不是内部存储目录,因为内部存储目录的空间很小。另外我也做了相关,如果将apk放到内部存储目录file下面的话,安装时会出现问题,提示解析包出错。
- 数据和缓存的区别
在中有数据和缓存这两个概念,那么这两者分别的是什么目录下面的数据呢?
数据
数据的是保存在中所有数据,就是上面提到的位于packagename下面的所有文件,包含内部存储(/data/data/packagename/)和外部存储(/storage/emulated/0/Andid/data/packagename/)。当然除了SD卡上面的数据,SD卡上面的数据当卸载之后还会存在的。
缓存
缓存是程序运行时的临时存储空间,它可以存放从络的临时片,从用户的角度出发缓存对用户并没有太大的影响,但是缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从络上获取。为了在缓存的时候能够正常与应用相关的缓存,请将缓存文件存放在getCacheDir或者 getExternalCacheDir路径下。
以上便是Andid中管存储目录的一些知识。