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

2024-04-29 02:36

本文主要是介绍android 分区存储(沙盒存储)适配总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、分区存储概念

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 之后分区存储机制带来的数据访问的特点和区分:

这篇关于android 分区存储(沙盒存储)适配总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944910

相关文章

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k