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

前言

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

公共目录:

Android中的外部存储(对适配AndroidQ提供基础)_第1张图片
image

Android7.0中的FileProvider

我们都知道Android7.0之后限制了对app的访问,如果需要访问自身app以外的文件目录,需要用到FileProvider 。我们会创建对应的.xml文件,并在清单文件中配置。


    

我们来看一下file_paths文件中的内容:


    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  

这样对Android中的外部存储以及Android7.0以后的FileProvider有很清晰的理解,并为AndroidQ适配的基础,后续会继续更新AndroidQ适配的文章,欢迎关注,谢谢~

你可能感兴趣的:(Android中的外部存储(对适配AndroidQ提供基础))