Android 12系统源码_存储(一)Android应用开发常见的存储目录

news/2024/8/30 23:12:10 标签: android, frameworks

前言

在 Android 中,存储涵盖了多种类型和用途,每种存储方式都有其特定的功能和适用场景。以下是 Android 中常见的存储方式和它们的主要特点:

一、Android 存储分类

Android 提供两类物理存储位置:内部存储空间 和 外部存储空间。

内部存储空间通常小于外部存储空间,不过,内部存储空间的数据存储时更加可靠。

内部存储空间目录:包括用于存储持久性文件的专属位置,也包括用于存储缓存数据的其他位置。系统会组织其他应用访问这些位置,并在 Android 10(API 级别为 29)及更高版本中,系统会对这些位置进行加密。这些特征使得这些位置非常适合存储只有应用本身才能访问的敏感数据。

外部存储空间目录:包括用于存储持久性文件的专属位置,也包括用于存储缓存数据的其他位置。虽然其他应用可以在具有适当权限的情况下访问这些目录,但是存储在这些目录中的文件仅供对应应用使用。如果明确其他应用可以访问数据,应将数据存储在外部空间的共享存储空间部分。表示外部存储空间也存在共有部分和私有部分,共有部分数据所有应用在一定权限下可以访问,私有部分数据仅供应用本身访问。

二、内部存储(Internal Storage)

2.1、特点

概念:内部存储不是内存。存储在内部存储中的文件只能被自己所访问,且一个应用创建的所有文件都在其应用包名目录下,也就是应用创建的内部存储文件是与应用相关联的,内部存储空间十分有限,当应用卸载后,内部存储的文件也会删除,以管理可贵的内部存储空间。

内部存储空间对于应用来说就是 “/data/data” 目录(/data/data/ 是软链接,实际挂载是在 /data/user/0/ 路径下的),其中有两个文件夹值得关注。

2.2、访问方法

通过 Context 的方法如 getFilesDir()、getCacheDir() 来访问应用的私有文件和缓存。

Context().getFilesDir() 获取的文件目录是:/data/user/0/应用包名/files
Context().getCacheDir() 获取的文件目录是:/data/user/0/应用包名/cache

三、外部存储(External Storage)

2.1、特点

外部存储比较容易混淆,因为比较旧的 Android 版本跟新的 Android 版本是有差别的。在 Android 4.4 之前,手机自带的存储空间是作为内部存储,扩展的 SD 卡是最为外部存储的。但是从 Android 4.4 系统开始,Google 将 Android 的机身存储从概念上分为 “内部Internal” 和 “外部Internal” 两部分。

外部存储的空间也有公共和私有的区别。对于应用而言,外部公共空间在一定权限下可以共享,而外部私有空间对于应用来说是无法互相访问的。

而对于可移动存储介质,例如 SD 卡、U盘等外部存储空间,外部存储即 storage 目录或者 mnt 目录。

关于外部存储的挂载,Android 原生中一直变动,在 Android 4.2 之后一直挂载在 /storage/emulated/legacy。而之前的 /storage/sdcard0、/sdcard、/mnt/sdcard 都软链接到 /storage/emulated/legacy 下。

在路径中出现的 “0”,是由于 Google 增加了多用户的概念。

2.2、访问方法

通过 Environment.getExternalStorageDirectory() 或 Context.getExternalFilesDir() 等方法来获取外部存储目录的路径。
在 Android 10 及更高版本中需要先获取对应的权限才能访问外部存储。

Environment.getExternalStorageDirectory() 获取的文件目录是:/storage/emulated/0
Context.getExternalFilesDir() 获取的文件目录是:/storage/emulated/0/Android/data/应用包名/files

四、 Android 中应用内外部存储路径

对于应用访问内外部存储路径,对如下 api 进行输出。

public void getStorageDirPath() {
        // 获取应用在内部存储的根路径
        File file = getContext().getDataDir();
        Log.d("Context().getDataDir()" , file.getAbsolutePath());

        // 获取应用在内部存储的 files 路径
        File file1 = getContext().getFilesDir();
        Log.d("Context().getFilesDir()" , file1.getAbsolutePath());

        // 获取应用在内部存储的 cache 缓存路径
        File file2 = getContext().getCacheDir();
        Log.d("Context().getCacheDir()" , file2.getAbsolutePath());

        // 获取外部存储根路径
        File file3 = Environment.getExternalStorageDirectory();
        Log.d("Environment.getExternalStorageDirectory()" , file3.getAbsolutePath());

        // 获取外部存储具体公共路径
        /*
         * 参数如下:
         * public static String DIRECTORY_MUSIC = "Music"
         * public static String DIRECTORY_PODCASTS = "Podcasts"
         * public static String DIRECTORY_RINGTONES = "Ringtones"
         * public static String DIRECTORY_ALARMS = "Alarms"
         * public static String DIRECTORY_NOTIFICATIONS = "Notifications"
         * public static String DIRECTORY_PICTURES = "Pictures"
         * public static String DIRECTORY_MOVIES = "Movies"
         * public static String DIRECTORY_DOWNLOADS = "Download"
         * public static String DIRECTORY_DCIM = "DCIM"
         * public static String DIRECTORY_DOCUMENTS = "Documents"
         */
        File file4 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
        Log.d("Environment.getExternalStoragePublicDirectory(Music)" , file4.getAbsolutePath());

        // 获取应用在外部存储中的 Files 路径
        File[] file5 = getContext().getExternalFilesDirs("");
        for (File file6 : file5) {
            Log.d("Context().getExternalFilesDirs()" , file6.getAbsolutePath());
        }

        // 获取应用在外部存储中的 cache 缓存路径
        File file7 = getContext().getExternalCacheDir();
        Log.d("Context().getExternalCacheDir()" , file7.getAbsolutePath());
    }

--------------------------------------------------------------------------------------------------------------------------------

输出如下:
D/Context().getDataDir(): /data/user/0/com.example.android
D/Context().getFilesDir(): /data/user/0/com.example.android/files
D/Context().getCacheDir(): /data/user/0/com.example.android/cache
D/Environment.getExternalStorageDirectory(): /storage/emulated/0
D/Environment.getExternalStoragePublicDirectory(Music): /storage/emulated/0/Music
D/Context().getExternalFilesDirs(): /storage/emulated/0/Android/data/com.example.android/files
D/Context().getExternalCacheDir(): /storage/emulated/0/Android/data/com.example.android/cache


http://www.niftyadmin.cn/n/5561098.html

相关文章

三、GPIO口

我们在刚接触C语言时,写的第一个程序必定是hello world,其他的编程语言也是这样类似的代码是告诉我们进入了编程的世界,在单片机中也不例外,不过我们的传统就是点亮第一个LED灯,点亮电阻,电容的兄弟&#x…

YOLOV5学习记录

前言: 计算机视觉 什么是目标检测? 物体分类和目标检测的区别 目标检测,物体的类别和位置 学习选题,口罩检查,人脸识别 算法原理:知乎,csdn,目前还没到这种程度 大大滴崩溃&am…

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程② | 5.4 - 5.8

前言 第 5 章对应的内容选择题和案例分析都会进行考查,这一章节属于技术的内容,学习要以教材为准。 目录 5.4 软件实现 5.4.1 软件配置管理 5.4.2 软件编码 5.4.3 软件测试 5.5 部署交付 5.5.1 软件部署 5.5.2 软件交付 5.5.3 持续交付 5.5.4…

前瞻断言与后瞻断言:JavaScript 正则表达式的秘密武器

JavaScript 中的前瞻断言(lookahead)和后瞻断言(lookbehind)相信用过的小伙伴就知道它的威力了,在一些特定的需求场景下,可以做到四两拨千斤的作用,今天让我们来盘点一下在 JavaScript 正则表达…

Qt 遍历Combbox下拉框的内容并进行判断

一共用到两个函数&#xff1a; 1、count()&#xff1b;用于计算当前Combox中一共有几个item。 2、itemText(int i)&#xff1b;参数 i 是需要查看item的索引。 用来查看当前item的text&#xff08;文本信息&#xff09;。 for(int i 0; i < ui->comboBox_displayDev-&g…

PYQT按键长按机制

长按按键不松开也会触发 keyReleaseEvent 事件&#xff0c;是由于操作系统的键盘事件处理机制。大多数操作系统在检测到键盘按键被长按时&#xff0c;会重复生成按键按下 (keyPressEvent) 和按键释放 (keyReleaseEvent) 事件。这种行为通常被称为“键盘自动重复”。 通过检测 …

【Linux杂货铺】期末总结篇4:shell编程

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️什么是Shell脚本&#xff1f;二. ⛳️Shell 入门三. ⛳️Shell 变量3.1 &#x1f514;变…

spark 事件总线listenerBus

事件总线基本流程 图片来源&#xff1a;https://blog.csdn.net/sinat_26781639/article/details/105012302 LiveListenerBus创建 在sparkContext初始化中创建LiveListenerBus对象。 主要变量有两个 queues&#xff1a;事件队列&#xff0c;里面存放四个队列&#xff0c;每…