Android 6.0+ 动态权限获取(包含对Android 10+、Android11+的支持)_android6.0+-程序员宅基地

技术标签: 安卓  Android开发  java  android  android studio  移动开发  

从Android6.0开始,权限获取不再是简单地在AndroidManifest.xml添加几行代码了,Google引入了动态权限的概念,需要在代码中添加。
动态权限添加步骤如下,以读取和写入权限为例:
1.AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1.1 从Android10开始,还需要添加:
<application
	android:requestLegacyExternalStorage="true"
	...
</application>
2.在Activity相应位置调用:
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == -1) {
    
                // 没有Write权限,动态获取
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{
    
                        Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                Log.d("TAG", "onCreate: 申请获得Write权限!");
            } else {
    
                Log.d("TAG", "onCreate: 已获得Write权限!");
            }
        }
然而在Android11开始,WRITE_EXTERNAL_STORAGE等特殊权限的获取又发生了变化…

Android11+的特殊权限变化

当仍沿用Android10-的权限获取方式时,会在调用权限时抛出异常
因为在Andorid11+中,Google添加了一个新的权限:MANAGE_EXTERNAL_STORAGE
当APP动态请求权限时,会引导用户进入一个权限设置界面

文件所有权设置界面

所以,在Android11+中:
1.2 AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
该权限仅支持Android11+

该权限仅支持Android11+

2.1 在Activity相应位置调用:
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    
            // new一个intent转到系统设置界面
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.setData(Uri.parse("package:" + mContext.getPackageName()));
            // 1024为REQUEST_CODE
            startActivityForResult(intent, 1024);
        }
2.2 所以合并起来的代码是:
    public void getWriteRight() {
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    
            // new一个intent转到系统设置界面
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.setData(Uri.parse("package:" + mContext.getPackageName()));
            // 1024为REQUEST_CODE
            startActivityForResult(intent, 1024);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == -1) {
    
                // 没有Write权限,动态获取
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{
    
                        Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                Log.d("TAG", "onCreate: 申请获得Write权限!");
            } else {
    
                Log.d("TAG", "onCreate: 已获得Write权限!");
            }
        }
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43267515/article/details/111239279

智能推荐

微信再次“杠上”支付宝!|畅言-程序员宅基地

文章浏览阅读4.9k次,点赞20次,收藏10次。继零钱通后再推微信支付分,微信支付挑战支付宝能否成功?作者 | 小谦编辑 | 郭芮从红包大战到共享大战,微信与支付宝的支付大战已经持续了多年。因为用户属性的限制,微信在支..._微信支付分租租物

vbnet 操作autoCAD之 给出矩形如何画内切椭圆_矩形斜内切椭圆-程序员宅基地

文章浏览阅读427次。'''给出矩形数据如何画椭圆 ''' <summary>难点,当ratio比例大于1时应当如何处理才能正常画出需要的椭圆 ''' 开始默认 水平方向长度比垂直方向的轴长,那就用短轴比长轴可得出比例,同时长轴在X方向上体现 ''' 比例大于1时,说明垂直方向的轴长,长轴应在Y轴上体现,此时比率取倒数计可 ''' 绘制椭圆,给出矩形推出内切椭圆 ''' </summary> ..._矩形斜内切椭圆

Linux readelf命令-程序员宅基地

文章浏览阅读2.2k次。readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。以下查看帮助文档readelf -h #显示帮助参数选项:也可参考readelf用法小记。_linux readelf

【机器学习实验】利用逻辑回归预测贷款违约行为Python实现_逻辑回归模型进行新用户的逾期预测-程序员宅基地

文章浏览阅读1.3k次,点赞29次,收藏26次。贷款违约预测是现代金融机构信用风险管理的基础。金融机构审批贷款时回收机客户的个人信息,包括年龄、收入、学历、职业、家庭情况和借贷历史等,在对各项信息综合考虑的基础上决定是否审批贷款。为了避免贷款违约,金融机构在对借贷人发放贷款的时候进行评估打分,预测贷款违约的概率,并做出是否发放贷款的判断。本案例利用逻辑回归模型预测贷款人是否会发生违约行为。通过贷款数据(包括个人信息、财务状况和贷款状态等)来训练模型,通过模型分析贷款人的偿还能力,预测贷款申请人是否会发生违约。_逻辑回归模型进行新用户的逾期预测

查看Tomcat和JDK版本信息(32位还是64位)_查看apache tomcat版本-程序员宅基地

文章浏览阅读499次,点赞12次,收藏6次。2、进入tomcat的bin目录:输入d: 回车,例如 cd tools\apache-tomcat-8.5.37\bin。信息如下:Architecture的后面,x86就是32位,amd64就是64位。1、打开dos命令(windows键+r,输入cmd)回车。3、输入catalina version 回车。结果为如下,就是64位的。_查看apache tomcat版本

微信小程序搜索(点击关键词搜索)_小程序的点击等于搜索吗-程序员宅基地

文章浏览阅读6.2k次,点赞3次,收藏54次。我上一个教程:点击查看 是简单的输入关键词搜索,现在我又写了一个2.0版本的,点击关键词,关键词会出现在搜索框并且自动完成搜索。动图演示index.wxml<!-- 标题 --><view class="title">小程序点击关键词搜索</view><!-- 搜索框view --><view class="search_con"><!-- 表单 --> <form bindsubmit="f_小程序的点击等于搜索吗

随便推点

checksum命令 linux_linux命令详解:md5sum命令-程序员宅基地

文章浏览阅读645次。作为一个运维工作者,日常肯定会频繁的更新,怎样区分每次的更新 更清楚的区别两次更新的文件的不同呢 推荐一个比较实用的方法,即获取每次更新文件的md5值。前言在网络传输、设备之间转存、复制大文件等时,可能会出现传输前后数据不一致的情况。这种情况在网络这种相对更不稳定的环境中,容易出现。那么校验文件的完整性,也是势在必行的。使用说明md5sum命令用于生成和校验文件的md5值。它会逐位对文件的内容进行..._md5checksum

MathType改变字体大小_mathtype字体大小怎么改-程序员宅基地

文章浏览阅读5.6k次,点赞6次,收藏21次。MathType改变字体大小_mathtype字体大小怎么改

Java多线程初学者指南系列教程_java多线程服务器教材-程序员宅基地

文章浏览阅读998次。http://developer.51cto.com/art/200512/15883.htm初学Java多线程:线程简介 本文为Java多线程初学者系列的第一篇,简单介绍了什么是Java的线程及多线程的好处。由于Java是纯面向对象语言,因此,Java的线程模型也是面向对象的。一、线程概述线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来作为这个程序运行的_java多线程服务器教材

权限提升-MSSQL&PostgreSQL_mssql 沙盒-程序员宅基地

文章浏览阅读692次。数据权限提升知识_mssql 沙盒

[解决方案] Java打成jar包找不到资源文件_java -jar classpath找不到boot-inf\classes下配置文件-程序员宅基地

文章浏览阅读5.3k次。文件放在resources文件夹下,打成jar包后会出现在BOOT_INF/classes/xx.xx下;文件路径使用绝对路径"/xx.xx",用classLoader加载url和创建InputStream:URL fileURL=this.getClass().getResource("/xx.xx");InputStream is=this.getClass().getResourceA..._java -jar classpath找不到boot-inf\classes下配置文件

Linux环境下c语言贪吃蛇项目_c++贪吃蛇linux开发-程序员宅基地

文章浏览阅读484次,点赞4次,收藏9次。贪吃蛇小游戏;Linux环境;二维数组;_c++贪吃蛇linux开发

推荐文章

热门文章

相关标签