Android R及以上版本中APP外部存储实现

背景:

从 Android R开始,Google 引入了一些新的限制,以增强用户数据的隐私保护。其中之一是对外部存储的访问限制。如果APP的target>30,之前的WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGE授权方案就完全不能使用了。本文将说明如何在 Android R及以上版本中实现外部存储空间的读写。

APP中实现在Android R及以上版本中外部存储路径下的读写方案,步骤概述如下:

步骤描述
1检查应用是否运行在 Android 11 上
2请求 MANAGE_EXTERNAL_STORAGE 权限
3检查是否已获得 MANAGE_EXTERNAL_STORAGE 权限
4获取外部存储路径

详细步骤如下:

步骤 1: 检查应用是否运行在 Android 11 上

在 AndroidManifest.xml 文件中添加以下代码,以指定应用的目标 SDK 版本为 30(Android 11):

<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="30" />

步骤 2: 请求 MANAGE_EXTERNAL_STORAGE 权限

在 AndroidManifest.xml 文件中添加以下代码,以请求 MANAGE_EXTERNAL_STORAGE 权限:

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

为了兼容Android R之前的版本,完整的配置代码如下:

<!-- 操作sd卡权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"tools:ignore="SelectedPhotoAccess" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"tools:ignore="SelectedPhotoAccess" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"android:maxSdkVersion="32"tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" />

步骤 3: 检查是否已获得 MANAGE_EXTERNAL_STORAGE 权限

在你需要访问外部存储路径的地方,添加以下代码,以检查是否已获得 MANAGE_EXTERNAL_STORAGE 权限:

if (Environment.isExternalStorageManager()) {// 已获得权限,可以访问外部存储路径
} else {// 未获得权限,需要请求权限Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION).setData(Uri.parse("package:"+getPackageName()));startActivityForResult(intent, 0);
}

步骤 4: 获取外部存储路径

在你需要获取外部存储路径的地方,添加以下代码,以获取外部存储路径:

File externalStorageDirectory = Environment.getExternalStorageDirectory();
String externalStoragePath = externalStorageDirectory.getAbsolutePath();

总结

通过以上步骤,就可以在 Android 11 中实现外部存储路径的访问。首先,需要检查应用的目标 SDK 版本是否为 Android 11及以上版本,然后请求 MANAGE_EXTERNAL_STORAGE 权限并检查是否已获得该权限,最后可以使用 Environment.getExternalStorageDirectory() 方法获取外部存储路径。

需要注意的是:从 Android 11 开始,外部存储路径不再是应用的专属目录,而是共享的目录。因此,对于敏感数据,建议将其存储在应用的内部目录中,而不是外部存储路径。

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

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

相关文章

实战攻防:蜜罐无关,溯源有术

前言 突然接到通知&#xff0c;甲方在HVV防守前突然收到内网IP地址出现Socks代理通信&#xff0c;审计流量发现确实属于socks流量&#xff0c;不属于告警流量&#xff0c;告警地址为个人终端&#xff0c;直接准入工具阻断等待排查。 态感告警 流量分析属于正常的socks流量。 …

【leetcode--O(1) 时间插入、删除和获取随机元素】

这道题要求实现一个类&#xff0c;满足插入、删除和获取随机元素操作的平均时间复杂度为 O(1)。 变长数组可以在 O(1) 的时间内完成获取随机元素操作&#xff0c;但是由于无法在 O(1)的时间内判断元素是否存在&#xff0c;因此不能在 O(1) 的时间内完成插入和删除操作。哈希表…

unify llm 大模型路由

Unify介绍 Unify是llm大模型路由框架。 Unify Python 包提供了对 Unify REST API 的访问&#xff0c;允许您从任何 Python 3.7.1 应用程序中查询大型语言模型&#xff08;LLMs&#xff09;。它包括了同步和异步客户端&#xff0c;并支持流式响应。 就像 REST API 一样&#…

【光伏预测】基于BP神经网络实现光伏发电功率预测附Matlab代码

matlab % 步骤1&#xff1a;加载光伏发电功率数据 load(‘solar_power_data.mat’); % 假设数据存储在变量power_data中 % 步骤2&#xff1a;数据预处理 % 将数据归一化到[-1, 1]的范围 minPower min(power_data); maxPower max(power_data); normalizedData (power_data …

职场思考-职场第三年规划重点(14)

&#xff08;职场第三年规划重点(上)&#xff09; 确定方向&#xff0c;拉进关系&#xff0c;提高思维 好的职业生涯规划必须具备以下三个特点&#xff1a; 合理性&#xff08;以当事人的天赋、性格和现有知识与技能为基础&#xff0c;是适合并为当事人所接受的&#xff09;、可…

根据用户显式内容——静态web网站与动态web网站

根据用户显式变化的内容 就像企业的Web网站一样&#xff0c;无论浏览网站的用户是谁&#xff0c;在什么时候访问&#xff0c;总是显式相同内容&#xff0c;这样的网站被称为静态Web网站;与此相对&#xff0c;用户发帖&#xff0c;不同人登录后显式不同内容的网站被称为…

vscode 如何debug(二)

在 Python 项目中配置 VS Code 进行远程调试是一个常见的需求。以下是详细的步骤&#xff0c;确保你可以顺利配置并进行调试&#xff1a; 1. 安装 DebugPy 首先&#xff0c;通过 pip 安装 debugpy&#xff1a; pip install debugpy -U2. 安装 VS Code 插件 确保你已经在 VS…

word-简历排版

1、确认字体&#xff08;微软雅黑&#xff09;、字号&#xff08;五号/小五&#xff09; 2、设置段间距和行间距、页边距 3、突出各模块标题&#xff0c;增加分格线 4、使用制表位进行对齐&#xff1a;视图-标尺&#xff0c;制表符&#xff08;tab&#xff09;和制表位共同使…

西贝柳斯终极版2023:Mac上的简易音乐记谱神器,谱写未来

Avid Sibelius Ultimate 2023 for Mac是一款专为Mac用户设计的音乐记谱软件&#xff0c;它以其强大的功能和直观的操作界面&#xff0c;为音乐创作者们提供了一个高效、便捷的创作平台。 一、音乐创作的得力助手 Sibelius Ultimate 2023不仅适用于有抱负的作曲家和词曲作者&a…

# Java 基础面试300题 (51-80)

Java 基础面试300题 &#xff08;51-80&#xff09; 051.Java中有那几种循环结构&#xff1f; 循环结构也被称为迭代语句&#xff0c;用于重复执行代码块。Java具有以下几种循环结构&#xff1a; while循环: while语句检查条件&#xff0c;只要条件为真&#xff0c;就会重复…

Python | 武理刷题2

1.文件打开方式 只读模式r 追加写模式a 覆盖写模式w 2. matplotlib绘制 散点图:scatter() 饼图 pie() 直方图&#xff1a;bar() 编程题&#xff1a; 3. 有五个数字&#xff1a;1、2、3、4、5&#xff0c;输出由这五个数字组成的所有互不相同且无重复数字的三位数 #有五个…

计算机网络学习记录 网络层 Day4(上)

计算机网络学习记录 网络层 Day4 &#xff08;上&#xff09; 你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner gitee https://gitee.com/Qiuner 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f60…

122. 买卖股票的最佳时机 II(中等)

122. 买卖股票的最佳时机 II 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;122. 买卖股票的最佳时机 II 2.详细题解 实现最大的利润&#xff0c;即只要有盈利就收入囊中&#xff0c;由于交易没有具体限制次数&#xff0c;因此可以依…

再论Web应用在医学研究中构建数据收集问卷(stremlit_survey包体验)

再论Web应用在医学研究中构建数据收集问卷&#xff08;Streamlit_survey包体验&#xff09; 概述 医学队列研究是临床研究的重要形式&#xff0c;这种研究通过收集临床诊疗过程中产生的数据而阐述疾病相关的因素。在临床数据收集过程中&#xff0c;Web APP体现出了一定的优势…

计算机毕业设计 | SpringBoot图书管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 开发一个学生成绩管理系统&#xff0c;采用计算机对学生成绩进行处理&#xff0c;进一步提高了办学效益和现代化水平。为广大教师和学生提高工作效率&#xff0c;实现学生成绩信息管理工作流程的系统化、规范化和自动化。现在我国中学的学生…

YOLOv8_obb训练流程-原理解析[旋转目标检测理论篇]

在旋转目标检测网络中,换了个顺序,先把训练流程捋一遍,然后再取捋一下测试的流程。由下图的YOLOv8l_obb网络结构图可以看到相对于目标检测网络,旋转目标检测网络只是在Head层不相同,在每个尺度特征层中增加了Angle分支(浅蓝色),通过两个卷积组和一个Conv卷积得到得到通…

jupyter之plt 画图弹出窗口展示图片以及静态图片切换方法

1. jupyter出图的三种方式 在python的Jupyter Notebook中&#xff0c;使用matplotlib绘制动态图形时&#xff0c;可能出现只显示一张静态图像。 这是因为在notebook中使用plt绘图共有三种模式&#xff1a; %matplotlib inline&#xff1a;这是默认的模式&#xff0c;输出的图片…

基于单片机的步进电机控制系统的研究

摘要: 步进电机控制作为一种电机控制系统的重要模式,属于现代数字化控制的重要手段,其应用已经相当广泛。步进电机属于感应电机类,利用电子电路将直流电分为分时供电、多相时序供电控制电流,利用这种电流为电机供电,驱使电机工作。步进电机不能够在常规模式下使用,必须通过双环…

C语言Prim算法和Prim-Alternat找最小生成树

文章目录 1、用prim算法求最小生成树C语言Prim算法实现 2、用Prim-Alternate算法求最小生成树3、C语言Prim-Alternate算法实现 1、用prim算法求最小生成树 绿色线会标记选过的边 从v1当作起始点开始&#xff0c;可选择: (v1,v2)权值为6 &#xff08;v1,v3&#xff09;权值为3 &…

C# as运算符

一、C# as运算符 as运算符用于执行引用类型的显式类型转换。请阅读C#数据类型。 using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Test {class Program{static void Main(string[] args){// C# as运算符-www.baike369.comob…