Android6.0权限管理以及使用权限该注意的地方
Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解、控 制 app 涉及到的权限。然而对开发人员来说却是一件比較蛋疼的事情。须要兼容适配,并保证程序功能的正常执行。
什么叫执行时权限管理呢?在Android 6.0以下的系统中,当我们在安装应用的时候,该应用就会提示我们这个应用所须要的权限,假设你要安装。那就必须允许赋予全部权限,可是假设不允许,那就仅仅能取消安装了,有点流氓。并且安装完后,你不能够收回这个权限。
而6.0就做到了执行时权限管理。即使安装的时候给了权限,也能够到系统设置里。去关闭该权限。
以下分几种情况来讲,由于执行时权限仅仅有在Android6.0及以上的手机版本号才有,所以这里仅仅考虑设备版本号大于6.0的手机。低版本号的手机在安装时就已经赋予了全部的权限。也不可能收回,就不考虑了,以下的情况仅仅分targetSdkVersion:
- targetSDKVersion大于等于23的时候,那么权限是能够被回收(revoke)。这里还要分权限。google将权限分为两种,一种是normal permission,还有一种是dangerous permission。
normal permission是指与用户隐私无关的权限。能够理解为无关紧要的权限,比方说訪问网络的权限。对用户来说没什么关系。dangerous permission就是会涉及到用户隐私的权限。比如读取用户手机联系人、短信等等。假设是normal permission的话,那么在安装的时候就会给,并且不会开放接口让用户回收该权限。app会一直拥有该权限,所以不用考虑这样的类型的权限。假设是dangerous permission的话,在安装的时候并未授予权限。系统开放接口允许用户回收或者赋予权限。以下是某个应用的权限,第一张图是dangerous permission。能够回收和赋予的。
点击上面的全部权限,能够查看到该应用全部的权限。
那么对于dangerous permission的话,在使用前须要去检查该permission是否已经被授予
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
假设该权限已经被授予,那么可继续执行你的代码,假设未授予,则须要向用户询问是否须要授予权限。弹出的框是系统界面,界面例如以下:
调用代码:
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
系统询问是否授予权限的页面结束后会有回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
//your implementations
}else{
ToastUtil.show(this, "权限不足。支付失败");
}
}
}
- 假设targetSdkVersion是小于23的。那么将觉得app没实用23新权限測试过,那么继续使用老规则:系统在安装的时候会默认给app赋予全部的权限,app能够照常执行。可是!可是!可是!
用户依旧能够回收权限,只是此回收非彼回收。先看下关闭权限时弹的页面:
看到了么。假设targetSDKVersion小于23的话,在关闭权限的时候。会弹一个警告框,告诉你这是旧版的android,关闭会有问题,假设你按拒绝。那么该权限将会关闭。并且界面上。权限的开关会显示关。可是这个权限却没有被回收(nexus 5x的手机亲測。当然其它的机子我也不敢打包票)。checkSelfPermission返回granted。我看了下。假设targetSDKVersion等于23的话。系统日志是:
假设targetSDKVersion是小于23的话,则日志是:
Permission related app op changed.
只是我猜想假设你要支持runtime permission的话,还是要把targetSDKVersion设为23。假设你的targetSDKVersion是小于23的话,那么还是要加上checkSelfPermission,以防万一。谁知道google会出什么坑。
还有就是权限的话,有分组的概念,看例如以下图:
假设一组中有一个被授予了,那么组内的也会默认被授予。
并且也支持同一时候申请多个权限,详细情况android developer官网。
以下是stackoverflow问题的网址:
http://stackoverflow.com/questions/36328151/ive-revoke-the-android-permission-but-checkselfpermission-still-return-granted
如有问题和错误的地方请指出。
以下就是要讲一些权限管理注意的地方。
对于权限的话,Activity和Fragment都有自己的requestPermissions和onRequestPermissionsResult回调,可是Activity是有checkSelfPermission。可是fragment是没有的,所以fragment假设想要检查权限,还得调用宿主activity的checkSelfPermission。
对了,平时直接调用checkSelfPermission和requestPermissions会报什么api错误,尽管编译不会通过,可是看着就是烦啊。能够调用ActivityCompat.checkSelfPermission(在supportv4包中)。
先看下Activity的requestSelfPermission这种方法:
public final void requestPermissions(@NonNull String[] permissions, int requestCode) {
Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions);
startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null);
}
看下这里是直接打开还有一个Activity进行操作,还用了startActivityForResult,回调会通过onRequestPermissionResult,我想这个回调应该是在onActivityResult里面处理。然后调这个onRequestPermissionResult函数的。
那么问题来了,假设我在onResume函数中申请某一个权限,调用requestPermissions,那么现象是什么样的呢?
第一次进入页面,弹出申请权限的对话框,假设点击允许。则正常,对话框不会再显示。可是假设第一次点击拒绝,则点击拒绝后重新弹出对话框来申请权限,假设你一直点拒绝。则对话框一直弹出,这是为什么呢?由于第一次进入页面并执行onResume函数时申请权限,进入还有一个页面。弹出对话框,假设你点击拒绝。先是回调onRequestPermissionResult,然后再执行onResume函数,这时又会再一次去检查权限,由于发现无权限,则再一次请求,如是,进入一个循环之中,除非你点允许,否则是个无限循环。
所以申请权限不妨不要写在onResume中,或者加一个标志位推断。
接下来再讲讲Fragment请求权限。
public final void requestPermissions(@NonNull String[] permissions, int requestCode) {
if (mHost == null) {
throw new IllegalStateException("Fragment " + this + " not attached to Activity");
}
mHost.onRequestPermissionsFromFragment(this, permissions,requestCode);
}
这里看到事实上是调用mHost请求权限的方法。mHost就是这个fragment的宿主Activity,所以Fragment请求权限实际上也是通过宿主Activity,当权限结果回调时,activity推断是从Fragment中来的还是从自己Activity中来的,再进行分发结果。
Github上也有一些比較好用的权限库:https://github.com/hotchemi/PermissionsDispatcher
Android6.0权限管理以及使用权限该注意的地方的更多相关文章
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- 【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】
一.权限计算相关分析 1.如何存储权限 首先说一下权限保存的问题,一个系统中最多有多少权限呢?一个大的系统中可能有成百上千个权限需要管理.怎么保存这么多的权限?首先,我们使用一个数字中的一位保存一种权 ...
- 【Linux】 Linux权限管理与特殊权限
Linux权限管理 权限管理这方面,非常清楚地记得刚开始实习那会儿是仔细研究过的,不知道为什么没有笔记留痕..除了一些基本的知识点早就忘光了,无奈只好从头开始学习一遍.. ■ 基本权限知识 这部分实在 ...
- SNF快速开发平台2019-用户安全控制-权限管理模型实践-权限都在这里
1.1 是否保存密码 勾选记住密码后,再次开启程序用户密码不需要再次输入,直接显示在密码输入框内,方便快捷. 图 4.1‑1 记住密码的登录页面框 1.2 是否自动登录 勾选自动登录后,再 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据 ...
- Linux系列教程(十六)——Linux权限管理之ACL权限
通过前面的两篇博客我们介绍了Linux系统的用户管理,Linux用户和用户组管理之相关配置文件 讲解了用户管理的相关配置文件,包括用户信息文件/etc/passwd,用户密码文件/etc/shadow ...
- Linux权限管理之ACL权限
注:转载自:https://www.cnblogs.com/ysocean/p/7801329.html 目录 1.什么是 ACL 权限? 2.查看分区 ACL 权限是否开启:dump2fs ①.查看 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- liunx权限管理之高级权限
高级权限 suid,sgid,sticky ======================================================== 文件权限管理之:高级权限 问题1: 为什么 ...
随机推荐
- CSS3-文本-word-wrap,word-break,white-space
一.word-wrap使用: 语法: word-wrap : normal | break-word 取值说明: 1.normal为默认值,当其值为normal控制连续文本换行(允许内容顶开容器的边界 ...
- verilog behaviral modeling -- procedural timing contronls
1.delay control : an expression specifies the time duration between initially encountering the state ...
- python--subprocess,粘包现象与解决办法,缓冲区
一. subprocess 的简单用法 import subprocess sub_obj = subprocess.Popen( 'dir', #系统指令 shell=True, #固定方法 std ...
- (转)UILabel常用属性
Java代码 收藏代码 #import "ViewController.h" #import <CoreText/CoreText.h> @interface View ...
- PAT Basic 1049
1049 数列的片段和 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1 ...
- IOS 自动布局-UIStackPanel和UIGridPanel(三)
在这一篇了我将继续讲解UIGridPanel. 在iphone的app里面可以经常看到一些九宫格布局的应用,做过html开发的对这类布局应该是很熟悉的.在IOS中要实现这样的布局方法还是蛮多的,但是我 ...
- Python算法-二叉树深度优先遍历
二叉树 组成: 1.根节点 BinaryTree:root 2.每一个节点,都有左子节点和右子节点(可以为空) TreeNode:value.left.right 二叉树的遍历: 遍历二叉树:深度 ...
- ajax原生post请求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ACM程序设计选修课——1081: 堆(BFS)
1081: 堆 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 26 Solved: 9 Description Input Output Sampl ...
- 浅谈中途相遇攻击--meet-in-the-middle attack
貌似挖的坑也够多了....好多都没填,这篇最后会不会TJ还得看心情TUT 看过大白书的人应该都会发现一种神奇的算法:中途相遇法.(在第58页)这种算法将以空间换时间的思路运用到了极致,但事实上它在密码 ...