Android权限管理
Android权限管理
说明
在targetSdkVersion
的值为23或者更高,就要进行权限管理,否则如果运行在Android6.0
或以上的设备会没有相应权限而导致崩溃
请求权限后,在onRequestPermissionsResult
方法回调,在该方法判断三种状态:允许获取权限、拒绝授予权限、拒绝授予权限且不再询问
权限组
Android将不同的权限分组管理,分为正常权限和危险权限。正常权限是不用申请的。在申请危险权限时,系统会向用户弹出一个申请权限的对话框,描述要获取的权限所在的权限组,而不是具体的要申请的权限。只要获得组内的任一权限,那么默认该权限组的所有权限申请成功,再次申请该组内的其他权限,系统将立刻授予权限,不会再显示申请权限对话框
危险权限共9组24个
权限组 | 描述 | 权限 |
---|---|---|
CALENDAR | 日历 |
READ_CALENDAR WRITE_CALENDAR
|
CAMERA | 相机 |
CAMERA
|
CONTACTS | 短信 |
READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS
|
LOCATION | 定位 |
ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION
|
MICROPHONE | 录制音频 |
RECORD_AUDIO
|
PHONE | 电话 |
READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
|
SENSORS | 传感器 |
BODY_SENSORS
|
SMS | 通讯录 |
SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS
|
STORAGE | 存储 |
READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE
|
使用
使用步骤
- 在清单文件中加入要使用的权限,如果在清单文件中没有事先声明权限,那么在
应用信息/权限
中看到指定权限的 - 先判断当前运行平台是否在
Android6.0
以上,是的话就检查是否已经获取到相应的危险权限 - 没有相应的危险权限那么就需要去申请权限
- 在
onRequestPermissionsResult
回调中查看结果,如果已经获取到权限,则去进行相应的操作。如果没有获取到权限,则有两种可能:禁止或者是禁止且不再询问。禁止的话,还能再下次使用时再去申请权限。如果是禁止且不再询问,那么想要进行下一步操作只能到应用信息/权限
界面去手动开启权限了
检查权限
==如果应用需要危险权限,则每次执行需要这一权限的操作时都必须检查自己是否具有该权限。用户始终可以自由调用此权限,因此,即使应用昨天使用了相机,它不能假设自己今天仍具有该权限。==
要检查是否具有某项权限,请调用 ContextCompat.checkSelfPermission()
方法。例如,以下代码段显示了如何检查 Activity 是否具有在日历中进行写入的权限:
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);
如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED
,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PERMISSION_DENIED
,且应用必须明确向用户要求权限。
请求权限
如果应用需要应用清单中列出的危险权限,那么,它必须要求用户授予该权限。Android 提供了多种权限请求方式。调用这些方法将显示一个标准的 Android 对话框,不过,不能对它们进行自定义
解释应用为什么需要权限
在某些情况下,可能需要帮助用户了解应用为什么需要某项权限。例如,如果用户启动一个摄影应用,用户对应用要求使用相机的权限可能不会感到吃惊,但用户可能无法理解为什么此应用想要访问用户的位置或联系人。在请求权限之前,不妨为用户提供一个解释。当然,只是一个解释
为了帮助查找用户可能需要解释的情形,Android 提供了一个实用程序方法,即 shouldShowRequestPermissionRationale()
。如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true
注:如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了Don't ask again选项,此方法将返回
false
。如果设备规范禁止应用具有该权限,此方法也会返回false
。
请求需要的权限
如果应用尚无所需的权限,则应用必须调用一个requestPermissions()
方法,以请求适当的权限。应用将传递其所需的权限,以及指定用于识别此权限请求的整型请求代码。此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到requestPermissions()
注:当应用调用
requestPermissions()
时,系统将向用户显示一个标准对话框。应用无法配置或更改此对话框。如果需要为用户提供任何信息或解释,应在用requestPermissions()
之前进行,如解释应用为什么需要权限中所述。
处理权限请求响应
当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的onRequestPermissionsResult()
方法,向其传递用户响应。应用必须替换该方法,以了解是否已获得相应权限。回调会将传递的相同请求代码传递给requestPermissions()
系统显示的对话框说明了应用需要访问的权限组;它不会列出具体权限。例如,如果请求READ_CONTACTS
权限,系统对话框只显示应用需要访问设备的联系人。用户只需要为每个权限组授予一次权限。如果应用请求该组中的任何其他权限(已在应用清单中列出),系统将自动授予应用这些权限。当请求此权限时,系统会调用的onRequestPermissionsResult()
回调方法,并传递PERMISSION_GRANTED
,如果用户已通过系统对话框明确同意权限请求,系统将采用相同方式操作。
注:应用仍需要明确请求其需要的每项权限,即使用户已向应用授予该权限组中的其他权限。此外,权限分组在将来的 Android 版本中可能会发生变化。代码不应依赖特定权限属于或不属于相同组这种假设
权限被拒绝且不再询问
这时候如果还坚持使用需要该权限的功能,那么就只能到应用详情界面去手动打开权限了,然后回到代码中再去检查是否已经获得权限
//跳转到应用详情界面
Intent intent = new Intent()
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS")
intent.setData(Uri.fromParts("package",getPackageName(), null));
startActivity(intent);
关键API
onRequestPermissionsResult
应用请求权限结果的回调,无论是同意或拒绝,都会在这里得到结果
ActivityCompat.shouldShowRequestPermissionRationale
向用户解释为什么需要该权限。如果应用之前已经请求过该权限且用户拒绝,那么将返回true
ContextCompat.checkSelfPermission
用来检查是否具有某种权限,如果应用具有此权限,方法将返回PackageManager.PERMISSION_GRANTED
,并且应用可以继续操作。如果应用不具有此权限,方法将返回PERMISSION_DENIED
,且应用必须明确向用户要求权限
ActivityCompat.requestPermissions
请求权限的方法,传入需要请求的权限和整数请求码
Android权限管理相关推荐
- android 一个字符串分两行显示_重新梳理Android权限管理
Android Developer指南中,对Android安全体系结构的核心有这么一个说法:默认情况下,任何应用程序都无权执行任何会对其他应用程序.操作系统或者用户产生负面影响的操作.这句话其实就很好 ...
- android 跳转权限管理的代码,Android权限管理
Android权限管理 说明 在targetSdkVersion的值为23或者更高,就要进行权限管理,否则如果运行在Android6.0或以上的设备会没有相应权限而导致崩溃 请求权限后,在onRequ ...
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- android 权限管理之判断禁止后不再提示
android 权限管理之判断禁止后不再提示 我看到了许多博客中写到了单独去判断shouldShowRequestPermissionRationale()方法的值去判断为是否为不再提示,结果遇到了小 ...
- 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)
前言:动态权限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用户当前APP所需要的权限,防止滥用.这些权限一般分为三种:(1)普通权限:直接man ...
- android10管理权限,Android 权限管理
关于运行时权限 在旧的权限管理系统中,权限仅仅在App安装时询问用户一次,用户同意了这些权限App才能被安装(某些深度定制系统另说),App一旦安装后就可以偷偷的做一些不为人知的事情了. 在Andro ...
- Android权限管理原理(含6.0)
前言 Android系统在MarshMallow之前,权限都是在安装的时候授予的,虽然在4.3时,Google就试图在源码里面引入AppOpsManager来达到动态控制权限的目的,但由于不太成熟,在 ...
- android 权限管理 主动防御,基于SEAndroid的敏感数据主被动防御机制分析与设计
摘要: 随着智能移动终端设备市场的不断扩张,Android系统已经成为智能移动终端市场中的领导者,占据着极其巨大的市场份额.与此同时,由于Android系统本身安全机制存在隐患,Android移动智能 ...
- Android权限管理详解
概述 Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用.操作系统或用户有不利影响的任何操作.这包括读写用户的私有数据(如联系人或电子邮件等).读写其他应用的文件.执行网络访问. ...
最新文章
- 当前最佳的YOLOv4是如何炼成的?细数那些Tricks
- 奇奇怪怪的大佬:理发店小弟到阿里P10
- pyqt QGridLayout示例
- OpenCV学习之视频读取与帧的提取、显示及保存
- 使用lisp函数控制cursor
- Qt Creator浏览项目内容
- django手机访问_Django从入门到大作业:2-见网页
- 记录 之 numpy扩充某一维度,并重复填充
- python--装饰器(附偏函数、断言)
- java蓝桥暑假班_Java实现 蓝桥杯VIP 算法提高 班级排名
- 跨越全场景统一架构三大挑战,MindSpore亮出“四招”
- xp系统服务器dns怎么设置在哪里设置,xp系统DNS怎么设置 DNS设置步骤
- 怎么改wps表格中折线图的横坐标?
- ‘nvidia-smi‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- 大学课程很少有教怎么设计单片机开发板,进阶板更不用说
- codeforces 1728E
- Arduino入门(一)
- ubuntu系统备份还原(迁移)到另外一台电脑上
- Unhandled exception:java.lang.IllegalAccessException提示报错
- window版加密磁盘
热门文章
- Http Module 介绍
- ESXi安装时遇到不识别的硬件的处理
- RHEL5.6环境下yum安装MySQL
- 在微信中调用ajax出现的问题
- Ubuntu 14.10 下安装java反编译工具 jd-gui
- 深入探究VC —— 编译器cl.exe(2)【转】http://blog.csdn.net/wangningyu/article/details/4837419...
- GDI+入门(5、在GDI+中绘制带动画效果的图片)
- android studio的 gradle 依赖同步错误解决方法
- Dubbo_异常_Service启动时默认将方法注册到内网IP
- 解决word、excel、ppt文件图标是空白的问题