大家都知道Android6.0即targetSdkVersion23之后要动态申请权限,网上也有很多封装好的权限申请代码,当然我也封装了。
今天就不对这个进行扯淡了,我们要知其然更要知其所以然,系统中权限有多少种?Android7.0又改了什么权限机制?动态申请权限的背后又是什么,我们能否绕过动态申请权限,而直接赋予APP权限?
系统权限的保护级别:
1)normal:是默认值。低风险的权限采用此级别。在app安装的时候,系统自动赋予此app请求的所有normal权限,而不会征求用户的同意(但是,在安装app之前,用户总是有权选择检查这些权限)。
(2)Particular:特殊权限,在Android系统中,主要由两个
SYSTEM_ALERT_WINDOW,设置悬浮窗。
WRITE_SETTINGS 修改系统设置。对应代码只需将上述代码对应的这两处地方修改 Settings.System.canWrite(this); Settings.ACTION_MANAGE_WRITE_SETTINGS
(3)Dangerous:较高风险的权限,此级别的权限意味着,请求权限的app将要访问用户的隐私数据或者控制设备,这可能给用户带来负面影响。
因为dangerous权限会引入潜在的风险,所以系统不会自动赋予此类权限给app。例如,在安装app的时候,会将dangerous权限展示给用户,并请求用户确认。
(4)signature:只有请求权限的app与声明权限的app的签名是一样的时候,系统才会赋予signature权限。如果签名一致,系统会自动赋予权限,而不会通知用户或者征求用户的同意。
(5)signatureOrSystem:signature|privileged,签名相同,或者申请权限的应用为系统应用(在system中),与signature类似,只是增加了系统中自带的app的声明 ,尽量不要使用该选项,因为signature已经适合绝大部分的情况。具有这一类标志的ApplicationInfo.PRIVATE_FLAG_PRIVILEGED才能够使用。
Android7.0之后权限又有了新的概念 (1)install权限也就是安装权限,安装时权限,是指在安装app的时候,赋予app的权限。normal和signature级别的权限都是安装时权限。不会给用户提示界面,系统自动决定权限的赋予或拒绝。(2)runtime权限,运行时权限,是指在app运行过程中,赋予app的权限。这个过程中,会显示明显的权限授予界面,让用户决定是否授予权限。如果app的targetSdkVersion是22及以下,dangerous权限是安装时权限,否则dangerous权限是运行时权限。
重点:
系统权限的定义是在frameworks/base/core/res/AndroidMainfest.xml文件当中。
系统默认开启的一些权限是在frameworks/base/services/core/java/com/android/server/pm/ DefaultPermissionGrantPolicy.java 运行权限信息保存在/data/system/users/0/ runtime-permissions.xml文件当中
重置默认设置Settings/src/com/android/settings/applications/ ResetAppsHelper.java
聪明的客官已经去看上面指示的系统源代码了,看完之后相信你就知道怎么直接赋予APP权限了。不过权限是一种安全机制,不应破坏。