首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Android 存储概览

编程知识
2024年08月22日 09:27

存储区​

Android 一开始就将存储区分为内部存储外部存储,对应手机自带的存储和可插拔的 sd 卡(可类比于 PC 的硬盘和 U盘)。

内部存储容量有限,Google 建议 App 数据尽量存储于外部存储中。

随着硬件技术发展,自带大容量空间的手机开始出现,关于内部存储的描述逐渐偏离现实了,于是从 Android 4.4(API 19)开始,官方不再将机身存储等同于内部存储,而是从逻辑上将其一部分划到外部存储,限制剩下那部分的容量,也就是现在所谓的内部存储。这一操作,使得原本内部存储和外部存储的特性和使用场景得以延续。

当然,如果在 4.4 系统及以上的手机上插了 sd 卡,那么 sd 卡也属于外部存储。

我们可以使用如下代码打印出所有的外部存储:

File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
    for(File file:files){
        Log.e("main",file);
    }
}

对于 4.4 以上的插了 sd 卡的大容量手机,应该会打印出如下信息:

/storage/emulated/0/Android/data/packname/files/mounted 
/storage/B3E4-1711/Android/data/packname/files/mounted 

文件

应用专属文件

仅供应用使用的文件,可以存储到内部存储或外部存储中的本应用专属目录,本应用访问时不需要任何权限。在数据安全方面,虽然都是专属目录,但是内部存储可以保证其它应用访问不到,而外部存储就比较复杂了。

在较低版本的 Android 系统中,只要声明READ_EXTERNAL_STORAGE权限就能访问位于外部存储空间中应用专属目录之外的任何文件;只要声明WRITE_EXTERNAL_STORAGE权限就能向应用专属目录以外的任何文件写入数据。

这实在是相当危险,谁也不希望自家应用中的数据被抓取或篡改。于是从Android 10(API 29)开始有了分区存储的概念,应用在默认情况下就能访问外部存储空间上自己的专属目录,以及本应用所创建的特定类型的媒体文件(使用MediaStore API,下面会讲到)。如此,除非特殊情况,应用不再需要声明上述权限了。

此时,如果应用在运行时请求与存储相关的权限,将会弹出请求对话框(动态申请)表明应用正在请求对外部存储空间的广泛访问权限。

Android 11(API 30)开始更进一步,干脆将 WRITE_EXTERNAL_STORAGE 权限的作用抹除(即使声明了该权限也没用)。这将应用的写权限完全限制在了本应用相关目录(专属目录和本应用创建的媒体文件)中。

ps:Android 11 引入了_MANAGE_EXTERNAL_STORAGE_权限,该权限替代 WRITE_EXTERNAL_STORAGE,提供对应用专属目录和 MediaStore 之外文件的写入权限,但对使用的要求更严格。如需了解详情,请参阅有管理存储设备上所有文件

共享文件

存储您的应用打算与其它应用共享的文件,包括媒体(图片、音频文件、视频)、其它类型文件。

媒体文件

使用 MediaStore API 访问。注意:即使您的应用已卸载,作为共享文件(保存在媒体库中)的媒体文件仍会保留在用户的设备上。

除访问自己的媒体文件外,访问其它应用的媒体文件需要权限——在 Android 11(API 30)或更高版本中,需要 READ_EXTERNAL_STORAGE;在 Android 10(API 29)中,需要 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE;在更低版本中,访问所有文件均需要相关权限。——不过这也不是绝对的。

比如照片选择器,它提供了一个可浏览界面,为用户提供了一种安全的内置授权方式,让用户可以向应用授予限于所选图片和视频的访问权限,而非整个媒体库的访问权限,该权限保留至设备重启或应用停止运行。使用照片选择器可以看作定制的动态申请权限的界面,至少从Android 13(API 32)开始,无需事先声明 READ_EXTERNAL_STORAGE。

其它文件

自 Android 4.4(API 19)始,官方提供了存储访问框架,便于应用与外部存储卷和云端存储空间在内的文档提供器互动。此框架支持用户与系统选择器互动,从而选择文档提供器以及供您的应用创建、打开或修改的特定文档和其它文件。

同照片选择器类似,由于用户参与选择您的应用可以访问的文件或目录,因此该机制无需任何系统权限,同时用户控制和隐私保护也得到了增强。

这些文件存储在应用专属目录和媒体库之外,且在应用卸载后仍会保留在设备上。

使用存储访问框架涉及以下步骤:

  1. 应用调用包含存储相关操作的 intent(ACTION_CREATE_DOCUMENT保存文件;ACTION_OPEN_DOCUMENT打开文件;ACTION_OPEN_DOCUMENT_TREE授予应用对该目录中所有文件和子目录的访问权限)。
  2. 用户看到一个系统选择器,供其浏览文档提供器并选择将执行存储相关操作的位置或文档。
  3. 应用获得对代表用户所选位置或文档的 URI 的读写访问权限。利用该 URI,应用可以在选择的位置执行操作。

数据

应用配置项

不赘述,就是简单的键值对。值得一提的是,之前都是使用SharedPreferences进行应用配置项的操作,现在官方建议使用Jetpack DataStore,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 基于Kotlin 协程Kotlin.Flow以异步、一致的事务方式存储数据。

数据库

基于SQLite的数据存储,一般选择Jetpack.Room这个半 ORM 简化数据 CRUD 操作。卸载应用时数据库会跟着删除。

From:https://www.cnblogs.com/newton/p/18373303
本文地址: http://shuzixingkong.net/article/1326
0评论
提交 加载更多评论
其他文章 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)
从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)
从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章) 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章) 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)
从开发者视角解析提示词工程:大模型时代的新型编程范式
1. 引言 在人工智能飞速发展的今天,大语言模型(LLM)、智能代理(Agent)、检索增强生成(RAG)、以及提示词工程(Prompt Engineering)这些词语频繁出现在我们的技术讨论中。今天,我们来聊聊提示词工程,看看它怎么成为开发者手中一种新型的“编程语言”。 2. 传统软件开发流程回
开发一个MutatingWebhook
介绍 Webhook就是一种HTTP回调,用于在某种情况下执行某些动作,Webhook不是K8S独有的,很多场景下都可以进行Webhook,比如在提交完代码后调用一个Webhook自动构建docker镜像 准入 Webhook 是一种用于接收准入请求并对其进行处理的 HTTP 回调机制。 可以定义两
[VS Code扩展]写一个代码片段管理插件(二):功能实现
@目录创建和插入代码片段代码片段列表代码片段预览代码片段编辑自定义映射默认映射自动完成项目地址 创建和插入代码片段 VS Code扩展提供了数据存储,其中globalState是使用全局存储的Key-Value方式来保存用户状态,支持在不同计算机上保留某些用户状态,详情请参考官方文档 若在编辑器区域
[VS Code扩展]写一个代码片段管理插件(二):功能实现 [VS Code扩展]写一个代码片段管理插件(二):功能实现 [VS Code扩展]写一个代码片段管理插件(二):功能实现
以产品的角度看《黑神话:悟空》的卓越打造
在市场中取得成功需要通过精准的市场定位、卓越的产品品质、有效的营销推广和持续的创新改进,打造出具有强大竞争力的产品
以产品的角度看《黑神话:悟空》的卓越打造 以产品的角度看《黑神话:悟空》的卓越打造 以产品的角度看《黑神话:悟空》的卓越打造
Linux CentOS 7 安装 Kafka 2.8.2 - 单机版 & JDK 11 & 切换 JDK版本
目录安装 JDK 11安装 Kafka下载 Kafka 2.8.2防火墙修改配置运行测试自启动验证端口 Kafka 从 2.6.0 开始,默认使用 Java 11 , 3.0.0 开始,不再支持 Java 8,详见:https://kafka.apache.org/downloads Produce
Linux CentOS 7 安装 Kafka 2.8.2 - 单机版   & JDK 11 & 切换 JDK版本 Linux CentOS 7 安装 Kafka 2.8.2 - 单机版   & JDK 11 & 切换 JDK版本
为什么用Vite框架?来看它的核心组件案例详解
这些核心组件功能共同构成了 Vite 的强大能力,使它成为一个高效、灵活且易于使用的前端构建工具,如果你还没用上 Vite,那就抓紧搞起来吧。
TF-IDF 算法原理以及源码实现
TF-IDF(Term Frequency-Inverse Document Frequency),是用来衡量一个词在文档中的重要性,下面看一下TDF-IDF的公式: 首先是TF,也就是词频,用来衡量一个词在文档中出现频率的指标。假设某词在文档中出现了( n )次,而文档总共包含( N )个词,则该
TF-IDF 算法原理以及源码实现 TF-IDF 算法原理以及源码实现