当前位置:   article > 正文

android默认授予所有应用权限以及特殊权限处理_defaultpermissiongrantpolicy.java

defaultpermissiongrantpolicy.java

默认授予应用权限

PackageManagerService作为android的主要系统服务之一,包含处理应用权限相关的职责。源码地址如下:

frameworks/base/services/core/java/com/android/server/pm

PMS成功启动时并收到回掉systemReady回进行应用权限授予。

    @Override
    public void systemReady() {
        ...
        // If we upgraded grant all default permissions before kicking off.
        for (int userId : grantPermissionsUserIds) {
            mDefaultPermissionPolicy.grantDefaultPermissions(userId);
        }
        ...
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

DefaultPermissionGrantPolicy为权限处理策略管理类。
源码地址

services/core/java/com/android/server/pm/permissions/DefaultPermissionGrantPolicy.java

grantDefaultPermissions方法进行根据应用属性和白名单进行权限授予。

    public void grantDefaultPermissions(int userId) {
        grantPermissionsToSysComponentsAndPrivApps(userId);
        grantDefaultSystemHandlerPermissions(userId);
        grantDefaultPermissionExceptions(userId);
   }
  • 1
  • 2
  • 3
  • 4
  • 5

这里并没有赋予所有系统应用权限,所以当进行应用时还是会显示权限检查的弹框。
DefaultPermissionGrantPolicy中有个请求全部应用权限的私有方法grantAllRuntimePermissions

    private void grantAllRuntimePermissions(int userId) {
        Log.i(TAG, "Granting all runtime permissions for user " + userId);
        final PackageList packageList = mServiceInternal.getPackageList();
        for (String packageName : packageList.getPackageNames()) {
            final PackageParser.Package pkg = mServiceInternal.getPackage(packageName);
            if (pkg == null) {
                continue;
            }
            grantRuntimePermissionsForPackage(userId, pkg);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可通过此方法进行所有应用权限赋予:

 public void grantDefaultPermissions(int userId) { 
        if (inited) {
            grantAllRuntimePermissions(userId);
        } else {
            grantPermissionsToSysComponentsAndPrivApps(userId);
            grantDefaultSystemHandlerPermissions(userId);
            grantDefaultPermissionExceptions(userId);            
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果不想所有应用都授予权限,可考虑在system/etc下的权限相关xml文件添加应用包名和所需权限。

处理特殊权限

android的特殊权限区别于运行时权限,无法通过弹框请求授予。例如SYSTEM_ALERT_WINDOW系统弹框权限(显示在其他应用上层),MANAGE_MEDIA_PROJECTION(录屏)等权限,需要进入对应设置届满授予权限。这些特殊权限分配“appop”保护级别,需要在AppOpsService管理,可通过AppOpsManager进行动态授权。
参考如下方式:

  AppOpsManager appOpsManager = ((AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE))
  appOpsManager.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
          applicationInfo.uid,
          packageName,
          AppOpsManager.MODE_ALLOWED);
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/261338
推荐阅读
相关标签
  

闽ICP备14008679号