【鸿蒙】权限管理

关注公众号:“极客马拉松”,可以订阅更多鸿蒙技术贴。发送“仓库”可获取相关代码。

在app访问系统资源或者使用系统能力的时候,需要进行权限的申请。通过这种方式来保护用户的个人数据和信息安全。
应用权限保护的对象可分为数据:个人相册、通讯录、位置信息等等;功能:麦克风、摄像头等。

概述

申请原则
配置文件声明。
最小化申请原则,非必要不申请,只在使用前申请,不影响与权限不相关的业务使用。

授权方式
权限类型分为system_grant(系统授权)和user_grant(用户授权)。
system_grant(系统授权)是风险等级比较低的权限类型,不会涉及到用户和设别的敏感信息。在安装程序的时候系统会自动授权,例如:网络权限。
user_grant(用户授权)是风险等级比较高的权限。会涉及到用户和设备的敏感信息。在申请这类权限的时候需要以弹窗的形式请求用户授权处理。

权限组和子权限
当遇到同时申请多个权限的时候,会弹出多个弹窗。影响体验。为了增强体验,系统将逻辑紧密相关的user_grant权限组合到一起,形成权限组合,这样只需要弹出一个弹窗即可。

权限机制的基本概念
应用的APL等级和权限的APL等级是一 一对应的。
应用APL等级
在这里插入图片描述
权限APL等级
在这里插入图片描述

申请应用权限

选择申请权限的方式
权限APL等级
应用在申请权限的时候首先需要对当前应用的APL等级和需要申请权限的APL等级进行比对。如果相匹配怎可以继续申请。下图为流程图。
在这里插入图片描述

声明权限
声明权限时候需要去module.json配置文件中声明
在这里插入图片描述

注意:在申请user_grant时候也就是需要弹窗申请的时候,reason和usedScene是必填。在申请网络权限这种低风险权限的时候可以选填。
在这里插入图片描述

向用户申请授权
在申请user_grant权限时候例如:获取位置信息、访问日历等是需要向用户申请授权的。
实现步骤:
1、在module.json里面进行声明。
2、检查用户是否已经授权权限
3、未授权权限则进行弹窗申请权限
4、检查用户授权结果。

实践

例子:申请地理位置权限。
1、明确申请的权限:
ohos.permission.LOCATION、ohos.permission.APPROXIMATELY_LOCATION
并在module.json中进行配置。

2、校验当前是否已经授权。
在申请权限之前要检验当前是否已经授权了权限。
//校验权限是否已经申请

  static checkPermission(permissions: Permissions) {
    //访问控制管理:获取访问控制模块对象。
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    //授权状态
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    // 获取应用程序的accessTokenID,要校验的目标应用的身份标识。通过bundleInfo进行获取
    let tokenId: number = 0;
    try {
      //获取当前的bundleInfo
      let bundleInfo: bundleManager.BundleInfo =
        bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
      tokenId = appInfo.accessTokenId;
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
    }

    // 校验应用是否被授予权限
    try {
      grantStatus = atManager.checkAccessTokenSync(tokenId, permissions);
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
    }

    return grantStatus
  }

3、首次申请权限
//申请权限

static requestPermission(permissions: Permissions[]) {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let context: Context = getContext() as common.UIAbilityContext;
    let permissionList: Permissions[] = []
    for (let event of permissions) {
      //权限为申请车工
      if (PermissionUtil.checkPermission(event) === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
        permissionList.push(event)
      }
    }
    atManager.requestPermissionsFromUser(context, permissionList,
      (err: BusinessError, data: PermissionRequestResult) => {
        if (err) {
          console.error(`requestPermissionsFromUser fail, err->${JSON.stringify(err)}`);
        } else {
          console.info('data:' + JSON.stringify(data));
          console.info('data permissions:' + data.permissions);
          console.info('data authResults:' + data.authResults);
          console.info('data dialogShownResults:' + data.dialogShownResults);
        }
      });
  }

4、二次向用户申请授权
当用户首次拒绝弹窗请求权限的时候,应用将无法再次通过requestPermisssionsFromUser拉起弹框。需要用户到系统页面手动设置。
除此之外,也可以通过requestPermissionOnSetting()中直接拉起权限设置弹窗。
// 二次拉起权限申请弹窗

  static requestAgainPermission(permissions: Permissions[]) {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let context: Context = getContext() as common.UIAbilityContext;
    atManager.requestPermissionOnSetting(context, permissions).then((data: Array<abilityAccessCtrl.GrantStatus>) => {
      console.info('data:' + JSON.stringify(data));
    }).catch((err: BusinessError) => {
      console.error('data:' + JSON.stringify(err));
    });
  }

总结

● 权限分为 system_grant(系统授权)和 user_grant(用户授权)。其中,用户授权的权限风险等级更高,因此在申请时,需要通过弹窗进行用户确认,并在配置文件中写入授权原因(reason)。
● 应用在申请权限时,需要关注权限的 APL(Access Permission Level) 等级。应用的 APL 等级决定了其可申请的权限范围,仅能申请与其自身 APL 等级相匹配的权限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值