美文网首页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