android 分区存储(沙盒存储)适配总结

news2024/11/26 18:21:35

目录

一、分区存储概念

1.外部存储分类

2.分区存储如何影响文件访问

二、分区适配方案

1. 应用分区存储的文件访问规定

(1).应用专属目录--私有目录

(2).共享目录文件--公有目录

2.MediaStore API介绍

3.Storage Access Framework介绍

三、所有文件访问权限

四、总结


一、分区存储概念

1.外部存储分类

可以分为两大类:私有存储和共享存储。

分类路径特点

私有存储(私有目录)

/storage/emulated/0/Android/data/包名1)每个应用在内部存储种都拥有自己的私有目录,其它应用看不到,彼此也无法访问到该目录;2)私有目录存放 app 的私有文件,会随着 App的卸载而删除。
共享存储(公有目录)/storage/emulated/0/Downloads(Pictures))1)除了私有存储以外,其他的一切都被认定是共享存储,比如:Downloads、Documents、Pictures 、DCIM、Movies、Music 等;2)公有目录下的文件不会跟随 APP 卸载而被删除

     

               

        在 Android 10 以前,只要程序获得了 READ_EXTERNAL_STORAGE 权限,就可以随意读取外部的存储公有目录;同时只要程序获得了WRITE_EXTERNAL_STORAGE权限,就可以随意在写入外部存储的公有目录上新建文件或文件夹。 

        Android 10 开始引进的 Android 系统存储管理机制-- 分区存储,意在限制APP对外部存储中公有目录的使用;APP可以查看外部存储设备内以下类型的文件,无需请求任何与存储相关的用户权限:

应用外部特定目录中(私有目录)的文件(使用getExternalFilesDir()访问)。
应用自己创建的照片、视频和音频(通过MediaStore访问)。

2.分区存储如何影响文件访问

类型位置访问应用自己生成的文件访问其他应用生成的文件访问方法卸载是否删除文件
私有存储应用特定的目录(私有目录)无需权限无法直接访问getExternalFilesDir()获取到属于应用自己的文件路径
共享存储Photo/ Video/Audio/无需权限需要权限
READ EXTERNAL STORAGE
MediaStore Api
共享存储Downloads无需权限无需权限通过存储访问框架SAF,加载系统文件选择器

二、分区适配方案

1. 应用分区存储的文件访问规定

(1).应用专属目录--私有目录

每个应用向自己的私有目录读写文件,不需要读写权限。
应用即使获取了读写权限,也无法访问其他应用的私有目录。
私有文件目录具体路径:storage/emulated/0/android/data/packageName/…

访问方式:
this.getExternalCacheDir() this.getExternalFilesDir(Environment.DOWNLOADS)

(2).共享目录文件--公有目录

共享目录文件需要通过MediaStore API或者Storage Access Framework方式访问

①MediaStore API 在共享目录指定目录下创建文件或者访问应用自己创建文件,不需要申请任何存储权限
②MediaStore API访问其他应用在共享目录创建的媒体文件(图片、音频、视频),
需要申请存储权限,未申请存储权限,通过ContentResolver查询不到文件Uri,即使通过其他方式获取到文件Uri,读取或创建文件会抛出异常;
③MediaStore API不能够访问其他应用创建的非媒体文件(pdf、office、doc、txt等), 只能够通过Storage Access Framework方式访问。

2.MediaStore API介绍

       Android 系统会自动扫描外部存储空间,将媒体文件按类型添加到系统预定义的 Images、Videos、Audio files、Downloaded files 集合中。

       Android 10 通过 MediaStore.Images、MediaStore.Video、MediaStore.Audio、MediaStore.Downloads 访问相对应共享目录文件资源。

MediaStore API创建文件

       Android 10版本 MeidaStore API只允许在共享目录指定目录创建文件, 非指定目录创建文件会抛出IllegalArgumentException, 创建文件目录汇总如下:

媒体类型Uri默认创建目录允许存储文件
lmagecontent://media/external/images/mediaPictures只能放图片
Audiocontent://media/external/audio/mediaMusic只能放图片
Videocontent://media/external/video/mediaMovies只能放视频
Downloadcontent://media/external/downloadsDownload任意类型

             MediaStore.Downloads.EXTERNAL_CONTENT_URI是Android10版本新增API,用于创建、访问非媒体文件,需要注意的是:虽然获取了存储权限,但是依然不能够删除和修改其他应用的文件。

MediaStore API 文件访问

3.Storage Access Framework介绍

      Android 10 里唯一一种访问其他应用创建的非媒体文件的途径是使用存储访问框架 (Storage Access Framework) 提供的文档选择器。SAF 访问外部存储空间的共享目录的文件不需要申请任何权限,原因很简单,它需要启动系统的文件选择器向用户申请操作指定的文件,有用户交互过程的动作本身就是权限管控了,自然也就可以不用预先申请权限。

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
 intent.setType("*/*");//设置类型--任意类型
 intent.addCategory(Intent.CATEGORY_OPENABLE);
 startActivityForResult(intent, READ_REQUEST_CODE);

三、所有文件访问权限

       分区存储机制很好地规范了 Android App 的存储行为,让它们读自己该读的,写自己该写的。但是有的应用天生就需要对 SD 卡进行全方位的访问,比如各种文件浏览器、垃圾清理软件等等,

      对此,Android 11 引入了一个新的权限:

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

   同时如果要申请此权限,需要打开设置界面,让用户手动设置: 

Intent intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
startActivityForResult(intent, 10010)

      这个权限就是用来获取所有文件的管理权限,那么是不是可以直接申请这个权限就可以了呢?是可以的,不过应用市场不让上架…所以大部分 App 是不允许使用这个权限的。

      如果是文件管理器、备份及存储类的应用。你需要在 Google Play Developer Console 上填写声明表格说明为什么需要 MANAGE_EXTERNAL_STORAGE 权限,提交之后会被审核是否加入白名单,一旦加入成功以后,您的应用就可以向用户索要权限了,如果用户也同意您应用的访问权限请求,MadiaStore 访问将不再过滤,包括非媒体库文件。但是获得此权限的应用仍然无法访问这些目录在存储卷上显示为 Android/data/ 的子目录,也就是属于其他应用的应用专属目录。

四、总结

Android10分区存储之后:

①特定于应用的目录(私有目录) –> 无需权限 –> 访问方法 getExternalFilesDir () –> 卸载应用时移除文件
②访问其他应用创建的--媒体集合 (照片、视频、音频) –> 需要权限 READ_EXTERNAL_STORAGE –> 访问方法 MediaStore –> 卸载应用时不移除文件
③访问其他应用创建的非media文件--下载内容(文档和电子书籍)–> 无需权限 –> 存储访问框架(加载系统的文件选择器)–> 卸载应用时不移除文件

Android11又将READ_EXTERNAL_STORAGE 细化为三个权限

 总结下 Android 10 之后分区存储机制带来的数据访问的特点和区分:

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

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

相关文章

十大USDT交易平台大全XEX交易所

USDT是一种基于比特币区块链网络的加密代币&#xff0c;主要运用于数字货币交易平台&#xff0c;以稳定币为主。USDT的核心价值在于其与真实货币的固定兑换比率1:1&#xff0c;所以被称为Tether。随着加密货币市场的不断壮大&#xff0c;越来越多的交易平台开始支持USDT&#x…

常用的4个Linux Shell脚本,实现运维自动化的基础

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是Shell脚本 二、实…

go引入自建包名报错 package XXX is not in std和goland设置GO111MODULE提示冲突

首先在引入自建包的时候报错 查找网上的解决方法&#xff1a; 1、goland取消勾选Enable Go modules integration 2、set GO111MODULEoff 但是都没解决&#xff0c;而且更奇怪的是&#xff0c;我在cmd里面查看go env就显示set GO111MODULEoff 但是在goland里面的终端输入 go…

户外小型气象站

TH-QC10随着环境保护意识的日益增强&#xff0c;气象监测在环保工作中扮演着越来越重要的角色。户外小型气象站作为一种便携、高效的气象监测设备&#xff0c;为环保工作提供了有力的支持。本文将对户外小型气象站的功能、应用场景进行简要介绍。 一、户外小型气象站的功能 户…

第九届中国海洋大学信息安全竞赛 Re 睡Lite wp

还得自己查资料 相近的版本就行 可以找到一些字符&#xff0c;经过分析可以猜测sub_48就是类似sleep的减速函数 就算真用芯片也跑不出来&#xff0c;一直sleep 往下翻可以找到很多字符 拼在一起可以大致看出flag

操作系统——优先权算法c++实现

变量描述 测试数据 5 A 0 4 4 B 1 3 2 C 2 5 3 D 3 2 5 E 4 4 1 先来先服务算法 简述 该算法实现非常简单就是对到达时间排个序&#xff0c;然后依次进行即可&#xff0c;对结构体的sort进行了重载 代码 void FCFS() {//先来先服务算法std::cout<<"\n\t\t\t\t\…

快速生成个人信息测试数据

特点&#xff1a; 业务测试的数据比较多&#xff0c;苦于测试数据生成麻烦&#xff0c;用javascripthtmlcss快速生成页面并支持导出&#xff1b; 用途&#xff1a; 1、可用于频繁的功能测试&#xff1b; 2、可用于性能测试参数化&#xff1b; 3、可用于自动化测试参数&…

Python | Leetcode Python题解之第58题最后一个单词的长度

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLastWord(self, s: str) -> int:ls[]for i in s.split():ls.append(i)return len(ls[-1])

二叉树理论和题目

二叉树的种类 在我们解题过程中二叉树有两种主要的形&#xff1a;满二叉树和完全二叉树。 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为 2 的结点&#xff0c;并且度为 0 的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 这棵二叉树为满二叉树…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Python绘制3D曲面图

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 探索Python中绘制3D曲面图的艺术 在数据可视化的世界中&#xff0c;3D曲面图是一种强大的工…

OpenCV如何模板匹配

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现背投 下一篇 &#xff1a;OpenCV在图像中寻找轮廓 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入图像之间…

Python学习笔记------异常

当检测到错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现一些错误提示&#xff0c;就是所谓异常&#xff08;bug&#xff09; 1、异常的捕获方法 任何程序运行过程中都可能出现异常&#xff0c;我们可以在力所能及的范围内&#xff0c;对可能出现的bug提…

家庭教育-家长指导手册

背景介绍 写这篇文章的动机&#xff1a;我在抖音上一个视频中看到孩子洗了碗&#xff0c;家长翻一本打印的册子&#xff0c;从里面找表扬的话。这个册子左侧写了孩子的行为&#xff0c;比如&#xff1a;洗碗&#xff0c;右边写了家长应该说的表扬的话。 所以&#xff0c;我寻思…

[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言 今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。 作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索&#xff0c;通过实验发现最佳的激活函数 f ( x ) x ⋅ sigmoid ( β x ) f(x) x \cdot \text{sigmoid}(βx…

MOS(My Oracle Support)怎么用?Oracle DBA必备技能!

MOS简介 老Oracle DBAer都知道MOS的前身是Metalink&#xff0c;2012年MOS替换掉原有的Metalink平台&#xff1b;MOS是Oracle提供的新一代在线支持平台&#xff0c;MOS平台整合了以前的Metalink功能&#xff0c;并提供了更强大的功能和用户体验。它允许客户提交和跟踪技术支持…

ubuntu系统搭建pytorch环境详细步骤【笔记】

实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; 搭建PyTorch环境的详细步骤如下&#xff1a; 1.安装Ubuntu系统&#xff1a; 下载Ubuntu的镜像文件并制作启动盘。将启动盘插入计算机&#xff0c;启动计算机并按照提示安装Ubuntu系统。 2.…

QT c++ 代码布局原则 简单例子

本文描述QT c widget代码布局遵循的原则&#xff1a;实中套虚&#xff0c;虚中套实。 本文最后列出了代码下载链接。 在QT6.2.4 msvc2019编译通过。 所谓实是实体组件&#xff1a;比如界面框、文本标签、组合框、文本框、按钮、表格、图片框等。 所谓虚是Layout组件&#x…

vue2编写主体页面

目录 一. 导入两张图片 二. 新建主体vue 三. 修改路由 1. 新增主体界面Main.vue的路由 2. 完整router/index.js代码如下&#xff1a; 在Vue 2中编写一个主体页面通常意味着创建一个包含导航栏、侧边栏、内容区域等的布局。以下是使用Vue 2和Element UI框架来构建一个简单的…

USB HID报告描述符学习

参考资料 HID 报告描述符 (qq.com)https://mp.weixin.qq.com/s?__bizMzU1ODI3MzQ1MA&mid2247485748&idx1&sn112bd8014eb96b03308b3b808549e8d4&chksmfc284ff1cb5fc6e770c2d2ece46c17bf2529901b45a357938978fa62163723556ad497b05c47&cur_album_id3340417…