我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 11及以上授予文件管理权限

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 11及以上授予文件管理权限

背景

安卓11改变了此前安卓系统对于文件管理的规则,在安卓11上,文件读写变成了特殊权限。应用默认只能读写自己的目录/android/data/包名

gradle配置

Android11系统对应用写入权限做了严格的限制。本文介绍如何获取文件读写权限。

项目中 build.gradle 的targetSdkVersion >= 29 ,会出现读写问题

  • 当targetSdkVersion = 29,通过设置requestLegacyExternalStorage=“true”,还能解决
  • 当targetSdkVersion = 30后,需要申请所有文件权限才能获取到写入权限

为了能直接usb安装,gradle.properties 需要设置(否则,在安装时会报异常:-15)

android.injected.testOnly=false

AndroidManifest添加权限设置

语法说明

申请权限,主要用到如下4个函数

  1. 检查权限
int checkSelfPermission(String)
  1. 申请权限
void requestPermissions(int, String...)
  1. 是否应该显示请求权限的说明
boolean shouldShowRequestPermissionRationale(String)
  1. 处理权限结果回调
void onRequestPermissionsResult(int,String[],int[])

上述四个方法中,前三个方法在support-v4的ActivityCompat中都有,建议使用兼容库中的方法。最后一个方法是用户授权或者拒绝某个权限组时系统会回调Activity或者Fragment中的方法。

checkSelfPermission的返回值有如下两种

  1. 已拒绝 PackageManager.PERMISSION_DENIED
  2. 已授权 PackageManager.PERMISSION_GRANTED

动态权限申请

Android 6.0之上Android11以下申请权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 6.0String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE};for (String p : perms) {int ret = ContextCompat.checkSelfPermission(activity, p);if (ret != PackageManager.PERMISSION_GRANTED) {//TODO 跳转到权限页,请求权限return;}}}

Android11申请权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {    //判断是否有管理外部存储的权限if (!Environment.isExternalStorageManager()) {//TODO 跳转到权限页,请求权限}}

跳转系统授权页面

跳转到“应用信息”页面

安卓默认只能跳转到 "应用信息"页面,但是国内手机厂商大多支持各自自定义的Intent,直接跳到应用程序权限页面

public static void goAppDetailsSettings(Context context) {    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);    intent.setData(Uri.fromParts("package", context.getPackageName(), null));    context.startActivity(intent);}

在这里插入图片描述

跳转到应用信息页面,页面包含如下内容

  1. 存储
  2. 电量
  3. 流量
  4. 通知
  5. 权限
  6. 默认打开

需要手动点击“权限”按钮,进入“应用权限”页面,然后开始设置相应的数据

在这里插入图片描述
在这里插入图片描述

跳转到“所有文件访问权限”

谷歌官方的安卓11在“应用权限”页面隐藏了对“存储”权限的设置(当然,很多国产机,即使到了安卓12,依旧支持原先的存储权限;但也存在部分不支持的,比如:OPPO Reno9 Pro+)

取而代之的是“所有文件访问权限”页面,该页面用来授予“所有文件的管理权限”,允许此应用读取、修改和删除此设备或任意已连接存储卷上的所有文件。如果您授予该权限,应用无需明确通知您即可访问文件

private void goManagerFileAccess(AppCompatActivity activity) {    // Android 11 (Api 30)或更高版本的写文件权限需要特殊申请,需要动态申请管理所有文件的权限    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {        Intent appIntent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);        appIntent.setData(Uri.parse("package:" + getPackageName()));        //appIntent.setData(Uri.fromParts("package", activity.getPackageName(), null));        try {            activity.startActivity(appIntent);        } catch (ActivityNotFoundException ex) {            ex.printStackTrace();            Intent allFileIntent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);            activity.startActivity(allFileIntent);        }    }}

这里面涉及到两个Settings

  1. 当前应用的文件访问权限:ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
  2. 所有需要文件访问权限的应用:ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION

切记,不要在安卓11以下调用该Intent,会导致闪退

在这里插入图片描述

测试存储权限是否授权

安卓11及以后,有如下几个函数判断是否赋予存储权限

  1. 老版读权限
ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
  1. 老版写权限
ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
  1. 安卓11新出的管理外置存储权限
ActivityCompat.checkSelfPermission(context, Manifest.permission.MANAGE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
  1. 安卓11新出的判断是否是外置存储管理器
Environment.isExternalStorageManager()

具体实验(VIVO Y77,安卓12)

  1. 初始化状态
isExternalStorageManager => falseREAD_EXTERNAL_STORAGE   => falseREAD_EXTERNAL_STORAGE   => falseMANAGE_EXTERNAL_STORAGE  => false
  1. 仅在“应用权限”页面,打开存储权限中的“允许管理所有文件”
isExternalStorageManager => trueREAD_EXTERNAL_STORAGE   => trueWRITE_EXTERNAL_STORAGE   => trueMANAGE_EXTERNAL_STORAGE  => false
  1. 仅在“应用权限”页面,打开存储权限中的“仅允许访问媒体文件”
isExternalStorageManager => falseREAD_EXTERNAL_STORAGE   => trueWRITE_EXTERNAL_STORAGE   => trueMANAGE_EXTERNAL_STORAGE  => false
  1. 仅在“所有文件访问权限”页面,授予权限
isExternalStorageManager => trueREAD_EXTERNAL_STORAGE   => falseWRITE_EXTERNAL_STORAGE   => falseMANAGE_EXTERNAL_STORAGE  => false

因此,可以得出如下结论

  1. 不要尝试判断 MANAGE_EXTERNAL_STORAGE 权限,因为其永远为false
  2. isExternalStorageManagerACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSIONACTION_MANAGE_ALL_FILES_ACCESS_PERMISSIONAPI,只能在安卓11及以上版本调用(低版本调用会闪退)
  3. “应用权限”页面,打开存储权限中的“允许管理所有文件”会使得isExternalStorageManager变为true;但反之在“所有文件访问权限”页面授予权限,并不会改变WRITE_EXTERNAL_STORAGE的允许情况

因此,为了兼容 安卓4.4-安卓12,在11以下,建议使用checkSelfPermission方法进行存储权限判断;而安卓11及以上使用Environment.isExternalStorageManager即可

来源地址:https://blog.csdn.net/chy555chy/article/details/128204682

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 11及以上授予文件管理权限

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android 11及以上授予文件管理权限

背景 安卓11改变了此前安卓系统对于文件管理的规则,在安卓11上,文件读写变成了特殊权限。应用默认只能读写自己的目录/android/data/包名 gradle配置 Android11系统对应用写入权限做了严格的限制。本文介绍如何获取文件
2023-08-17

Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)

平台      Android11 + RK3566 + AndroidStudio Android 权限的变化, 几乎每个版本的SDK都会有, 其中最大的一次是在6.0时, 增加的动态权限申请 读写存储的权限也几经更迭, 对开发人员来说,
2023-08-21

java在Linux服务器上给新生成的pdf文件以及父文件夹赋予权限

在Linux服务器上,可以使用`chmod`命令为文件和文件夹赋予相应的权限。假设新生成的PDF文件名为`newfile.pdf`,并且位于一个名为`folder`的父文件夹中,可以使用以下命令为文件和文件夹赋予权限:```shell# 为
2023-09-13

java在Linux服务器上给新生成的pdf文件以及父文件夹赋予权限

Linux服务器上PDF文件与父文件夹权限设置本指南介绍如何在Linux服务器上为新生成的PDF文件及父文件夹设置适当的读写执行权限,以确保文件安全和访问控制。
java在Linux服务器上给新生成的pdf文件以及父文件夹赋予权限
2024-04-10

win8如何开启管理员帐户以及为其他账户赋予管理员权限

首先使用“Windows键+X”的组合键打开系统菜单,选择“计算机管理”,然后按顺序进入“系统工具-本地用户和组-用户”。打开用户组这时候我们就能看到当前的账户列表了,
2022-06-04

Android11及以上文件读写权限申请详细介绍

安卓11改变了此前安卓系统对于文件管理的规则,在安卓11上,文件读写变成了特殊权限,下面这篇文章主要给大家介绍了关于Android11及以上文件读写权限申请的相关资料,需要的朋友可以参考下
2022-11-13

Linux文件/目录的权限及归属管理使用

一、文件的权限和归属概述 1、访问权限读取r:允许查看文件内容、显示目录列表; 写入w:允许修改文件内容,允许在目录中新建、移动、删除文件或子目录; 可执行x:允许运行程序、切换目录 2、归属(所有权)属主:拥有该文件或目录的用户账号; 属
2022-06-04

uhe理解Linux系统中的文件名和文件种类以及文件权限

本篇内容主要讲解“uhe理解Linux系统中的文件名和文件种类以及文件权限”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“uhe理解Linux系统中的文件名和文件种类以及文件权限”吧!Linux文
2023-06-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录