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

server/2024/10/22 10:53:26/

目录

一、分区存储概念

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.ppmy.cn/server/30840.html

相关文章

linux安装MySQL 8.0笔记

在Linux系统中安装MySQL 8.0的详细操作步骤如下&#xff1a; 1. 添加MySQL Yum Repository 首先&#xff0c;您需要添加MySQL的Yum仓库。这可以通过下载并安装一个RPM包来实现&#xff0c;该RPM包会将MySQL仓库添加到您的仓库列表中。 wget https://repo.mysql.com//mysql80-c…

使用hutool工具导入excel Java

Hutool是一个Java工具类库&#xff0c;它提供了一系列实用的API&#xff0c;包括操作Excel的功能。要使用Hutool导入Excel&#xff0c;你可以使用ExcelReader类。以下是一个简单的例子&#xff0c;展示了如何使用Hutool导入Excel文件&#xff1a; import cn.hutool.poi.excel.…

[1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java旅游资源网上填报系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

堆排序以及TOP-K问题

片头 嗨&#xff01;小伙伴们&#xff0c;大家好&#xff01;今天我们来深入理解堆这种数据结构&#xff0c;分析一下堆排序以及TOP-K问题&#xff0c;准备好了吗&#xff1f;我要开始咯&#xff01; 一、堆排序 这里我们先假设要排成升序&#xff0c;也就是从左到右&#xf…

springboot整合mybatis配置多数据源(mysql/oracle)

目录 前言导入依赖坐标创建mysql/oracle数据源配置类MySQLDataSourceConfigOracleDataSourceConfig application.yml配置文件配置mysql/oracle数据源编写Mapper接口编写Book实体类编写测试类 前言 springboot整合mybatis配置多数据源&#xff0c;可以都是mysql数据源&#xff…

IvorySQL 3.2 发版 | 基于PG16.2,新增Oracle XML函数兼容功能

[发行日期&#xff1a;2024年4月11日] IvorySQL 3.2基于PostgreSQL 16.2&#xff0c;引入了多种Oracle XML函数的全面兼容性功能&#xff0c;同时修复了多个问题&#xff0c;更多信息请参考文档网站。 >>>新版本体验链接&#xff1a; https://docs.ivorysql.org/cn…

【JAVA基础之反射】反射详解

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 1.反射 1.1 概述 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它…

Pytorch学习笔记——TensorBoard的初使用

1、TensorBoard介绍 TensorBoard是TensorFlow的可视化工具&#xff0c;但它也可以与PyTorch结合使用。TensorBoard提供了一个Web界面&#xff0c;可以展示你训练过程中的各种信息&#xff0c;如损失值、准确度、权重分布等&#xff0c;更好地帮助开发者理解和调试模型。 Tenso…