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

公共目录:

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容