Android 7.0系统在运行应用的时候,对权限做了诸多限制,normal, dangerous, signature, signatureOrSystem ,取决于保护级别,在确定是否授予权限时,系统可能采取不同的操作。
normal 表示权限是低风险的,不会对系统、用户或其他应用程序造成危害;
dangerous 表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限;
signature 表示只有当应用程序所用数字签名与声明引权限的应用程序所用数字签名相同时,才能将权限授给它;
signatureOrSystem 表示将权限授给具有相同数字签名的应用程序或android 包类。这一保护级别适和于非常特殊的情况,比如多个供应商需要通过系统映像共享功能时
权限等级的定义在frameworks/base/core/res/AndroidManifest.xml文件中,其实如果不考虑权限降低对系统的损害的话,可以在这个文件里面修改权限级别~,我把frameworks/base/core/res/AndroidManifest.xml的源码列出如下:
在做项目时有客户要求不要弹出权限允许的窗口,所以我就将权限默认全部允许了,文件路径在packages/apps/PackageInstaller/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java,修改代码如下
在onCreate里面加上
for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) {
onPermissionGrantResult(group.getName(),true,true);
}
然后修改
@Override
public void onPermissionGrantResult(String name, boolean granted, boolean doNotAskAgain) {
GroupState groupState = mRequestGrantPermissionGroups.get(name);
//if (groupState.mGroup != null) { //注释掉这行
if (groupState != null && groupState.mGroup != null) { //加上判断groupState != null
因为部分应用不申请权限,所以要判断groupState
if (granted) {
groupState.mGroup.grantRuntimePermissions(doNotAskAgain);
groupState.mState = GroupState.STATE_ALLOWED;
这样修改完成后,在应用进行权限申请的时候就不会弹出窗口了,大功告成~~~