本文原创发布在华为开发者社区

介绍

本示例基于abilityAccessCtrl实现了应用获取相机权限,位置信息以及步数信息三种常见权限的功能,每个权限都需要向用户申请,用户确认后才可开启。

应用获取不同权限源码链接

效果预览

请添加链接描述

使用说明

  1. 点击“打开相机”按钮,跳转到获取相机权限页,点击开始预览,应用向用户申请相机权限。
  2. 点击“获取位置信息”按钮,应用向用户申请位置权限,用户同意后,位置信息会显示在页面上。
  3. 点击“获取步数信息”按钮,跳转到获取步数查看权限页。

实现思路

调用requestPermissionsFromUser方法拉起弹框请求用户授权,点击获取时获取权限,在实际业务场景获取权限还需再判断一次是否已经授权,防止用户撤销授权。
核心代码如下,源码参考RequestPermission.ets

 //获取权限弹框
  async requestPermissions(permission: Permissions[], context: Context): Promise<void> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let result: PermissionRequestResult = await atManager.requestPermissionsFromUser(context, permission);
    let grantStatus: Array<number> = result.authResults;
    let length: number = grantStatus.length;
    for (let i = 0; i < length; i++) {
      if (grantStatus[i] !== 0) {
        //授权失败
        return;
      }
    }
    // 授权成功
    return;
  }

  //检查权限是否存在
  async onRemoteMessageRequest(permissionName: Permissions): Promise<boolean> {
    let flag: boolean = true;
    let callerTokenId: number = rpc.IPCSkeleton.getCallingTokenId();
    hilog.info(0X0000, 'testTag', 'RpcServer: getCallingTokenId result: ' + callerTokenId);
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    try {
      let res: number = await atManager.checkAccessToken(callerTokenId, permissionName)
      flag = (res === -1 ? false : true);
    } catch (err) {
      hilog.info(0X0000, 'testTag', `catch err->${JSON.stringify(err)}`);
    }
    return flag;
  }

鸿蒙场景化代码
1 声望0 粉丝