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

默认授予应用权限

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);
        }
        ...
    }

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

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

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

    public void grantDefaultPermissions(int userId) {
        grantPermissionsToSysComponentsAndPrivApps(userId);
        grantDefaultSystemHandlerPermissions(userId);
        grantDefaultPermissionExceptions(userId);
   }

这里并没有赋予所有系统应用权限,所以当进行应用时还是会显示权限检查的弹框。
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);
        }
    }

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

 public void grantDefaultPermissions(int userId) { 
        if (inited) {
            grantAllRuntimePermissions(userId);
        } else {
            grantPermissionsToSysComponentsAndPrivApps(userId);
            grantDefaultSystemHandlerPermissions(userId);
            grantDefaultPermissionExceptions(userId);            
        }
    }

如果不想所有应用都授予权限,可考虑在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);
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言并肃

感谢大哥支持!您的鼓励是我动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值