美文网首页Android
Android中的外部存储(对适配AndroidQ提供基础)

Android中的外部存储(对适配AndroidQ提供基础)

作者: 会撒娇的犀犀利 | 来源:发表于2019-12-10 13:52 被阅读0次

前言

上一篇中我们介绍了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

公共目录:

image

Android7.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适配的文章,欢迎关注,谢谢~

相关文章

网友评论

    本文标题:Android中的外部存储(对适配AndroidQ提供基础)

    本文链接:https://www.haomeiwen.com/subject/myqggctx.html