前言
上一篇中我们介绍了Android中的内部存储,这篇我们将介绍一下外部存储
。
首先看下面一行代码
String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath();
这句代码的含义是什么呢?
获取SD卡根目录
说到sd卡根目录,最近在适配AndroidQ的时候,发现我们项目中所有使用到保存到本地的功能都是存储在sd卡根目录下,先在sd卡根目录中创建自己app的目录,里面存放对应的文件、apk、图片等。
这种存储方式的缺点在于不能灵活使用自身项目所在目录的空间,而是全部将所有文件数据存放于SD卡根目录,不便于后期维护,而且在AndroidQ中,不允许直接操作不属于自身目录的文件及文件夹,适配工程相当大。
所以为了能更好的适配,我们需要对外部存储做分区调整
,像保存图片
类似的功能如果需要在应用卸载后继续保存,可以存放在公共目录及pictures
目录下
外部存储的私有目录
因内部存储空间有限,Android在外部存储空间中提供了特殊目录供app存放私有文件,路径地址:
/storage/emulated/0/Android/data/app_package_name
我们可以通过AndroidStudio中的FileExplorer
查看。
在未调用任何api的情况下,该私有目录并没有以我们包名命名的文件夹目录。
getExternalFilesDir()方法
Android系统默认不会为我们创建私有目录,除非我们需要,那么该如何手动创建呢?
File externalFilesDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
调用上面代码为我们创建了一个自身app的私有目录,且在对应的私有目录中创建了一个
“Pictures”
的目录,返回一个file对象,即对应的地址为:/storage/emulated/0/Android/data/packagename/files/Pictures
。
再比如我们需要自定义一个目录文件夹:
File myself = getExternalFilesDir("test");
其路径地址为:
/storage/emulated/0/Android/data/packagename/files/test
getExternalCacheDir()方法
File externalCacheDir = getExternalCacheDir();
在外部私有目录中创建一个cache目录,路径为:
/storage/emulated/0/Android/data/packagename/cache
这是用来存放app缓存文件的。
这里需要注意一点:内部存储cache和外部存储chache有啥区别?
-
对于内部存储,只有本App才可以访问;
-
对于外部私有目录,本App可以直接访问
其他App在自Android7.0开始,系统对应用私有目录的访问权限进一步限制,
无法通过 file:// 这种形式的uri直接读写该目录下的文件内容,而是通过FileProvider访问
-
两者都会随着app的卸载而自动删除数据
内部存储、外部存储使用场景
一般来说,App需要保存在本地的数据无非两种,一种和app相关的,比如用户信息、log数据等,一种就是与app无关的,比如图片。
第一种数据会随着App的卸载而删除,而图片等不关联app的数据,应该永久存储在手机中,除非用户手动删除。
如何获得外部存储的公用目录
String externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
此方法主要获取的是公共目录下的pictures目录,路径为:/storage/emulated/0/Pictures
。
公共目录:
imageAndroid7.0中的FileProvider
我们都知道Android7.0之后限制了对app的访问,如果需要访问自身app以外的文件目录,需要用到FileProvider
。我们会创建对应的.xml
文件,并在清单文件中配置。
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="app的包名.fileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
我们来看一下file_paths文件中的内容:
<paths>
<!-- Context.getFilesDir() + "/path/" -->
<files-path name="my_files" path="test/"/>
<!-- Context.getCacheDir() + "/path/" -->
<cache-path name="my_cache" path="test/"/>
<!-- ----------以下为外部存储路径------------- -->
<!-- Context.getExternalFilesDir(null) + "/path/" -->
<external-files-path name="external-files-path" path="test/"/>
<!-- Context.getExternalCacheDir() + "/path/" -->
<external-cache-path name="name" path="test/" />
<!-- Environment.getExternalStorageDirectory() + "/path/" -->
<external-path name="my_external_path" path="test/"/>
<!-- Environment.getExternalStorageDirectory() + "/path/" -->
<external-path name="files_root" path="Android/data/<包名>/"/>
<!-- path设置为'.'时代表整个存储卡 Environment.getExternalStorageDirectory() + "/path/" -->
<external-path name="external_storage_root" path="."/>
</paths>
这样对Android中的外部存储以及Android7.0以后的FileProvider有很清晰的理解,并为AndroidQ适配的基础,后续会继续更新AndroidQ适配的文章,欢迎关注,谢谢~
网友评论