2-3.Android 存储之存储空间(私有空间、公共空间)

news2024/11/15 10:42:57

一、内部存储与外部存储

  1. 内部存储指位于设备的内部存储空间

  2. 外部存储指位于设备的外部存储介质,例如,SD 卡

  • 简单理解,内部存储就是存储在手机自身,外部存储就是存储在手机可以外接的东西,好比电脑的硬盘和 U 盘

二、存储空间

  • Android 中存储空间分为私有空间和公共空间,这两种空间在数据存储的用途上和访问权限有所不同
1、私有空间
  1. 私有空间是专门为每个应用程序分配的存储空间

  2. 它用于存储该应用程序的私有数据,例如,数据库文件、SharedPreferences 文件、缓存文件等

  3. 私有空间通常位于设备的内部存储中

  4. 私有空间通常具体位于 /data/data/【应用包名】/

  5. 应用程序可以直接在其私有空间内读写文件,无需任何权限

  6. 私有空间会随着应用的消亡而消亡

2、公共空间
  1. 公共空间是供所有应用程序共享的存储空间

  2. 它用于存储公共数据,例如,照片、音频、视频等

  3. 公共空间分为内部存储和外部存储

  4. 公共空间通常具体位于 /storage/emulated/0/(模拟的 SD 卡路径),或位于 /storage/【external_storage】/(真实的外部存储介质路径)

  5. 访问公共空间中的数据需要相应的权限,有 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE

  6. 公共空间不会随着应用的消亡而消亡


三、存储空间的目录

1、私有空间的目录
(1)基本介绍
  1. /data/data/【应用包名】/:应用的根目录

  2. /data/data/【应用包名】/files/:应用存储持久性文件的目录,例如,配置文件

  3. /data/data/【应用包名】/cache/:应用存储缓存文件的目录,系统可能会在设备存储空间不足时自动清除这些文件

  4. /data/data/【应用包名】/databases/:应用存储数据库文件的目录

  5. /data/data/【应用包名】/shared_prefs/:应用存储 SharedPreferences 文件的目录

(2)注意事项
  1. 我们通常只关注并直接获取 files 和 cache 目录

  2. 通常不会直接获取 databases 和 shared_prefs 目录

  3. 我们通常只关注内部存储的私有空间的目录

(3)目录获取
  1. 获取内部存储的私有空间的目录
String filesDirPath = getFilesDir().getPath();
Log.i(TAG, "------------------------------ " + filesDirPath);

String cacheDirPath = getCacheDir().getPath();
Log.i(TAG, "------------------------------ " + cacheDirPath);
  • 输出结果
I/MainActivity: ------------------------------ /data/user/0/com.my.storage/files
I/MainActivity: ------------------------------ /data/user/0/com.my.storage/cache
  1. 获取外部存储的私有空间的目录
String externalFilesDirPath = getExternalFilesDir(null).getPath();
Log.i(TAG, "------------------------------ " + externalFilesDirPath);

// 可以通过传递 type 参数来获取不同类型的子目录
String externalFilesPicturesDirPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES).getPath();
Log.i(TAG, "------------------------------ " + externalFilesPicturesDirPath);

String externalCacheDirPath = getExternalCacheDir().getPath();
Log.i(TAG, "------------------------------ " + externalCacheDirPath);
  • 输出结果
I/MainActivity: ------------------------------ /storage/emulated/0/Android/data/com.my.storage/files
I/MainActivity: ------------------------------ /storage/emulated/0/Android/data/com.my.storage/files/Pictures
I/MainActivity: ------------------------------ /storage/emulated/0/Android/data/com.my.storage/cache
2、公共空间的目录
(1)基本介绍
  1. 图片:通常位于 /storage/emulated/0/Pictures/ 下,用于存储图片,例如,用户拍摄的照片、应用下载的图片

  2. 音频:通常位于 /storage/emulated/0/Music//storage/emulated/0/Audio/ 下,用于存储音频,例如,用户下载的音频、应用产生的音频

  3. 视频:通常位于 /storage/emulated/0/Movies//storage/emulated/0/Video/ 下,用于存储,例如,如用户录制的视频、应用下载的视频

  4. 下载:通常位于 /storage/emulated/0/Download/ 下,用于存储下载的文件,例如,APK 安装包、文档、压缩包

  • 注:公共空间的目录具体路径可能因设备而异
(2)目录获取
String picturesDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
Log.i(TAG, "------------------------------ " + picturesDirPath);

String musicDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
Log.i(TAG, "------------------------------ " + musicDirPath);

String moviesDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getPath();
Log.i(TAG, "------------------------------ " + moviesDirPath);

String downloadDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
Log.i(TAG, "------------------------------ " + downloadDirPath);
  • 输出结果
I/MainActivity: ------------------------------ /storage/emulated/0/Pictures
I/MainActivity: ------------------------------ /storage/emulated/0/Music
I/MainActivity: ------------------------------ /storage/emulated/0/Movies
I/MainActivity: ------------------------------ /storage/emulated/0/Download

四、存储空间的版本变化

  • 从 Android 10(API 级别 29)开始,Android 引入了分区存储机制,以限制应用对存储空间访问
  1. 在 Android 10 之前,应用可以直接通过文件系统来访问私有空间和公共空间,简单来说就是通过路径可以直接访问

  2. 在 Android 10 之后,应用开始只能通过文件系统来访问私有空间,想要访问公共空间,需要借助其他方式,例如,存储访问框架(SAF)、MediaStore

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7-1 两个有序链表序列的交集

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。 输出格式:…

『功能项目』切换职业技能面板【49】

我们打开上一篇48切换职业面板的项目, 本章要做的事情是制作第二职业法师技能面板、第三职业面板并且完成切换 双击打开Canvas进入预制体空间 复制三个技能栏面板 重命名 设置第一技能栏 设置第二职业技能栏 设置第三职业技能栏 修改脚本:ChangeProfess…

TS.38-2

2.4.4 空闲模式 如果设备在接收DISPLAY TEXT STK主动命令时处于空闲模式,设备必须从这种待机模式切换到显示相关弹出窗口。一旦STK命令处理完成(例如用户选择了“确定”按钮),设备必须返回到其初始状态。 2.4.5 锁屏 - 手动解锁…

Spark实操学习

Spark学习 一、Spark-Shell编程1. 配置python3(三台服务器都要配置)2. 开始Spark编程3. spark-shell工具 二、Java项目测试1. 新建项目2. Spark-java代码测试 三、Scala项目测试1. 安装scala2. 安装包管理器sbt3. 在编译工具中安装scala工具4. 新建项目5. spark-scala代码测试 …

1.MySQL在Centos 7环境安装

目录 MYSQL在Centos7环境安装MySQL环境配置清理环境检查安装包获取官方yum源安装mysql服务配置my.cnf设置开机启动 MYSQL在Centos7环境安装 MySQL环境配置 安装的时候,用户切换成root。初期练习,mysql不进行用户管理,全部使用root进行&#…

【数据结构】排序算法系列——堆排序(附源码+图解)

堆排序 堆排序基于一种常见的**[[二叉树]]结构**:堆 我们前面讲到选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n一1次。本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则无法知道它是最小的记录。 …

THREE.js:网页上的3D世界构建者

THREE.js:网页上的3D世界构建者 前言 THREE.js 是一个强大的基于 JavaScript 的库,它使得在网页上创建和展示三维图形变得异常简单。 通过封装复杂的 WebGL 技术,THREE.js 提供了一套丰富的 API,让开发者能够轻松地构建出令人印…

Pytorch详解-Pytorch核心模块

Pytorch核心模块 一、Pytorch模块结构_pycache__Cincludelibautogradnnoptimutils 二、Lib\site-packages\torchvisiondatasetsmodelsopstransforms 三、核心数据结构——Tensor(张量)在深度学习中,时间序列数据为什么是三维张量?…

利用 FastAPI 和 Jinja2 模板引擎快速构建 Web 应用

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,它基于标准 Python 类型提示。FastAPI 支持异步编程,使得开发高性能的 Web 应用变得简单快捷。在本文中,我们将探讨如何使用 FastAPI 结合 Jinj…

单线程与2个线程的简易理解

前言 有个需要10个步骤完成的任务,假设每个步骤需要1秒 单线程耗费10秒完成任务 2根线程可能耗费6秒,也可能更少 单线程程序 单线程下,步骤按照次序顺序执行,共计耗费10秒 2个线程的程序 有步骤可以在同一时刻同时运行&…

Python酷库之旅-第三方库Pandas(117)

目录 一、用法精讲 516、pandas.DataFrame.add_suffix方法 516-1、语法 516-2、参数 516-3、功能 516-4、返回值 516-5、说明 516-6、用法 516-6-1、数据准备 516-6-2、代码示例 516-6-3、结果输出 517、pandas.DataFrame.align方法 517-1、语法 517-2、参数 51…

Linux操作系统如何添加新字体

在一个Linux操作系统及办公软件刚安装后,会发现缺少常用的“楷体_GB2312”和“仿宋_GB2312”字体。此时,只需要从其它电脑复制到或者从互联网上下载到这两个字体文件,然后导入到自己的电脑即可,再次打开办公软件就会看到这个字体已…

Playwright 与 Selenium对比

通过这篇关于 Playwright 与 Selenium 的文章,我们将更容易理解 Playwright 和 Selenium 之间的关键区别,并找出哪个工具可能更适合您的需求。 在自动化测试工具方面,Playwright 和 Selenium 都是软件测试人员使用的强大的 Web 自动化工具。它…

PointNet++改进策略 :模块改进 | EdgeConv | DGCNN, 动态图卷积在3d任务上应用

目录 介绍核心思想及其实现核心思想实现步骤 如何改进PointNet**局部几何结构的处理****动态图的引入****特征聚合的灵活性****全局和局部特征的结合** 论文题目:Dynamic Graph CNN for Learning on Point Clouds发布期刊:TOG作者单位:麻省理…

基于JDK1.8和Maven的GeoTools 28.X源码自主构建实践

目录 前言 一、GeoTools与Jdk的版本关系 1、GeoTools与Jdk版本 2、编译环境简介 二、使用Maven编译GeoTools28.X 1、GeoTools28.x 2、Maven的完整编译 3、构建时的问题 三、总结 前言 想要学习和掌握一个开源软件或者项目,源码是我们主要学习的内容。学习开…

NeurIPS 2023 | 基于 Llama 的单变量时序预测基础模型

概率时间序列预测是在广泛应用中出现的一个重要实际问题,包括金融、天气预报、脑成像和计算机系统性能管理等领域。针对这一任务,已经提出了各种方法,从传统的自回归模型到最近基于深度学习架构的神经预测方法。这些以前的方法大多集中在用来…

八、动态规划-算法总结

文章目录 八、动态规划8.1 背景8.1.1 DFS8.1.2 DFS的优化8.1.3 从DFS到动态规划 8.2 使用场景8.3 四点要素 常见四种类型8.4 矩阵类型8.4.1 最小路径和8.4.2 不同路径8.4.3 不同路径 II 8.5 序列类型8.5.1 爬楼梯8.5.2 最长递增子序列8.5.3 单词拆分小结 8.6 双序列类型8.6.1 最…

匹配行最大值替换为最小值公式

好的!我们一步一步详细讲解这个公式的作用和如何实现你想要的功能。 ### 数据结构假设: - 你的数据在 A、B、C 列中,每一行都有值。 - 需要在 A 列和 B 列相同的行中,找到 C 列中的最大值,将其替换为最小值,其他值保持不变。 ### 公式: ```excel =IF(C2=MAX(IF(($A$2:$…

借老系统重构我准备写个OpenAPI3.1版的API管理工具(附录屏演示)

前段时间一直在忙公司老系统重构的方案设计,其中最大的重构点就是前后端分离。为了加快前后端协同开发和对接的工作效率,我决定写一个公司内部使用的OpenAPI3.1版的API管理工具。 文章目录 有现成的工具为啥不用现有成熟方案初步成果展示录屏演示下一步计…

调制是什么,为什么

一、什么是调制、解调? 调制:将信息承载到满足信道要求的高频信号上的过程就是调制。 解调:解调是调制的逆过程,将有用的信息从高频信号中恢复出来的过程就是解调。 二、为什么需要调制? 通信是为了实现“信息”的传…