Android6.0权限管理

Android 6.0 Marshmallow首次加入了运行时权限管理,这对用户来说,可以更好的了解、控 制 app 涉及到的权限。然而对开发者来说却是一件比较蛋疼的事情,需要兼容适配,并保证程序功能的正常运行。

什么叫运行时权限管理呢?在Android 6.0以下的系统中,当我们在安装应用的时候,该应用就会提示我们这个应用所需要的权限,如果你要安装,那就必须同意赋予所有权限,但是如果不同意,那就只能取消安装了,有点流氓。而且安装完后,你不可以收回这个权限。

而6.0就做到了运行时权限管理,即使安装的时候给了权限,也可以到系统设置里,去关闭该权限。

下面分几种情况来讲,因为运行时权限只有在Android6.0及以上的手机版本才有,所以这里只考虑设备版本大于6.0的手机,低版本的手机在安装时就已经赋予了所有的权限,也不可能收回,就不考虑了,下面的情况只分targetSdkVersion:

  1. 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, "权限不足,支付失败");
        }
    }
}
  1. 如果targetSdkVersion是小于23的,那么将认为app没有用23新权限测试过,那么继续使用老规则:系统在安装的时候会默认给app赋予所有的权限,app可以照常运行。但是!但是!但是!用户依然可以回收权限,不过此回收非彼回收。先看下关闭权限时弹的页面:

    看到了么,如果targetSDKVersion小于23的话,在关闭权限的时候,会弹一个警告框,告诉你这是旧版的android,关闭会有问题,如果你按拒绝,那么该权限将会关闭,而且界面上,权限的开关会显示关,但是这个权限却没有被回收(nexus 5x的手机亲测,当然其他的机子我也不敢打包票)。比如说我旧版的app,targetSDKVersion也少于23,然后将该app跑在6.0的手机上,并且在设置里将权限给关闭,重新跑该app,发现其并不会崩溃,在运行到checkSelfPermission的时候,发现某个权限明明已经被关闭,但是这个函数却返回告诉说该权限被赋予,这不是见鬼了么,而且这个权限也能被正常使用。上网搜了一把,这种情况很多,但是网上的人情况不同,有些是关闭权限,checkSelfPermission返回granted,但是使用权限的时候,就抛出异常。

    后来也有人说看系统日志的,我看了下,如果targetSDKVersion等于23的话,系统日志是:

    如果targetSDKVersion是小于23的话,则日志是:

    Permission related app op changed.

我已经在stackoverflow上提问了,但是还没人回答,我也还没找到原因和官方说法,不过有些人说targetSDKVersion小于23的app,只能通过卸载应用才能收回权限,这些猜想尚未证实。

不过我猜想如果你要支持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

如有问题和错误的地方请指出。

时间: 2024-12-10 19:08:58

Android6.0权限管理的相关文章

Android拍照,相册选择图片以及Android6.0权限管理

概述 在android开发过程中,拍照或者从相册中选择图片是很常见的功能.下面要说得这个案例比较简单,用户点击按钮选择拍照或者打开相册选择图片,然后将选中的图片显示在手机上.android6.0后,推出了动态权限管理.以往我们将涉及到的权限全部写在清单文件中,只要用户安装了该程序,程序在运行过程中都会获得相应权限.android6.0后,对于一些特别敏感的权限,开发者必须在程序中进行声明.拍照和从相册选择图片都是涉及到用户隐私的敏感权限,必须在程序中进行声明. 大概的流程 创建布局文件,这里不多

Android6.0权限管理以及使用权限该注意的地方

Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解.控 制 app 涉及到的权限.然而对开发人员来说却是一件比較蛋疼的事情.须要兼容适配,并保证程序功能的正常执行. 什么叫执行时权限管理呢?在Android 6.0以下的系统中,当我们在安装应用的时候,该应用就会提示我们这个应用所须要的权限,假设你要安装.那就必须允许赋予全部权限,可是假设不允许,那就仅仅能取消安装了,有点流氓.并且安装完后,你不能够收回这个权限. 而6.0就做到了执行时权限管理.

android6.0权限管理工具EasyPermissionUtil

前言 android6.0開始,权限的申请发生了改变,申请变的动态化,也就是执行时权限,和iOS相仿,动态化的意思是指,在每次使用须要危急权限的方法的时候.须要检查程序是否获得了该权限的许可.动态化的权限申请能够让用户更加清晰的知道程序须要什么权限.以及程序中哪些地方的操作须要涉及用户安全. 不再是只在程序安装的时候,一次性把所须要的普通的.危急级别的权限一次性列出来.然后展示给用户. 当project项目的target Sdk为23时,因为考虑到用户假设没有进行权限的动态检查,那么在执行到须要

Android开发——Android 6.0权限管理机制详解

0.前言 最近在研究所实习,我负责维护Android手机取证项目的Android客户端,有客户反映我们的APP在Android6.0无响应,经过调试发现SD卡读写权限权限被拒绝.但明明是在AndroidManifest.xml文件中声明过的.查了很多资料才知道Android6.0的很多权限申请机制发生了改变,可以说是Android6.0在安全机制上更进了一步吧,因此写下这篇文章以记录. 注:在运行程序时,对于某些权限向用户询问申请(后面会详细地讲)时因为我们知道客户在我们APP中不会点"拒绝&q

Android6.0M权限管理实战,完美轻量级封装

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53189359 本文出自[DylanAndroid的博客] Android6.0M权限管理实战,完美轻量级封装 随着Android版本的不断更新,Android再权限管理方面的诟病越来越明显.Google的Android开发人员也意识到了Android应用在权限管理方面的各种问题,让好多用户摸不着头脑就使用了用户的隐私数据. 为了在权限这方面加强管理,给用户一个比较好的体验.A

Android_设备隐私获取,忽略6.0权限管理

1.前言 (1).由于MIUI等部分国产定制系统也有权限管理,没有相关api,故无法判断用户是否允许获取联系人等隐私.在Android 6.0之后,新增权限管理可以通过官方api判断用户的运行状态: (2).我们指定targetSdkVersion为23或者之后我们还需要在运行时请求这些所需的权限.这很重要,因为已经出现了很多开发者把targetSdkVersion飙到了最新,然后发现自己的app疯狂的崩溃,这是由于他们没有实现执行运行时权限请求的代码.当你已经把一个targeting API

Android 6.0 权限管理

Android 6.0 权限管理 Android permission 运行时权限(Runtime permission) 旧版兼容 6.0权限弹框的两种模式 6.0之后的权限分类 Normal permissions(普通权限) Dangerous permissions(危险权限) 运行时权限请求的基本步骤 权限请求策略 运行时权限(Runtime permission) android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次.一旦安装了,app可以在用户毫不知晓

Android6.0权限系统

Android6.0权限系统 Android权限系统是一个非常重要的安全问题,因为它只有在安装时会询问一次.一旦软件本安装之后,应用程序可以在用户毫不知情的情况下使用这些权限来获取所有的内容. 很多坏蛋会通过这个安全缺陷来收集用户的个人信息并使用它们来做坏事的情况就不足为奇了. Android团队也意识到了这个问题.在经过了7年后,权限系统终于被重新设置了.从Anroid 6.0(API Level 23)开始,应用程序在安装时不会被授予任何权限,取而代之的是在运行时应用回去请求用户授予对应的权

1.Android6.0运行时权限简介_2.Android6.0权限适配之WRITE_EXTERNAL_STORAGE(SD卡写入)3_.Android 6.0 运行时权限理解

Android6.0运行时权限简介:http://unclechen.github.io/2016/03/05/Android6.0%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9D%83%E9%99%90%E7%AE%80%E4%BB%8B/ Android6.0权限适配之WRITE_EXTERNAL_STORAGE(SD卡写入):https://blog.csdn.net/xiechengfa/article/details/52699233 Android 6.0 运行时权