HarmonyOS NEXT 权限申请系统授权和用户授权权限

举报
水滴石轩 发表于 2025/03/14 09:08:29 2025/03/14
【摘要】 在鸿蒙原生开发中,我们normal级别的证书能够使用的权限分为系统授权权限和用户授权权限其中系统授权权限只需要在模块的module.json5中requestPermissions中添加name就可以了,不需要reason等信息描述,但用户授权就需要reason和使用方式,同时在使用时还需要向用户弹框申请;下面时定位权限和网络权限的申请"requestPermissions": [ { "...

在鸿蒙原生开发中,我们normal级别的证书能够使用的权限分为系统授权权限和用户授权权限

其中系统授权权限只需要在模块的module.json5中requestPermissions中添加name就可以了,不需要reason等信息描述,但用户授权就需要reason和使用方式,同时在使用时还需要向用户弹框申请;下面时定位权限和网络权限的申请



"requestPermissions": [
  { "name": "ohos.permission.LOCATION",
    "reason": "$string:permissionsReason",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when":"always"
    }
  },
  { "name": "ohos.permission.APPROXIMATELY_LOCATION",
    "reason": "$string:permissionsReason",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when":"always"
    }
  },
  {
    "name": "ohos.permission.INTERNET",
  }
]

无论是用户授权的权限还是系统授权的权限,我们再使用相应api接口时,都需要检查以下是否申请了权限,不然有异常的



export async function checkPermissionGrant(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
  return new Promise(async (resolve, reject) => {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;

    // 获取应用程序的accessTokenID
    let tokenId: number = 0;
    try {
      let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
      tokenId = appInfo.accessTokenId;
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      CSLogger.info(TAG, `Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
    }

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

export async function checkPermissions(permissions: Permissions, callback?: Callback<number>): Promise<boolean> {
  return new Promise(async (resolve, reject) => {
    // 获取权限状态
    checkPermissionGrant(permissions).then((grantStatus: abilityAccessCtrl.GrantStatus) => {
      let isGrantStatus: boolean = (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);
      if (!isGrantStatus) {
        // 申请权限
        CSLogger.info(TAG, `${permissions} Permission false`);
        resolve(false);
      } else {
        // 已经授权,可以继续访问目标操作
        CSLogger.info(TAG, `${permissions} Permission true`);
        resolve(true);
      }
    })
  });
}

检查完权限后,如果是用户授权的权限还需要用户弹框申请



export function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): Promise<number> {
  return new Promise(async (resolve, reject) => {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
    await atManager.requestPermissionsFromUser(context, permissions).then((data) => {
      CSLogger.info(TAG, `requestPermissionsFromUser data:${JSON.stringify(data)}`);

      let grantStatus: Array<number> = data.authResults;
      let length: number = grantStatus.length;
      for (let i = 0; i < length; i++) {
        if (grantStatus[i] === 0) {
          // 用户授权,可以继续访问目标操作
          CSLogger.info(TAG, `LOCATION req true, APPROXIMATELY_LOCATION req true`);
          resolve(0);
        } else {
          // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
          CSLogger.info(TAG, `请到系统应用“设置”中打开相应的权限。路径:设置 > 隐私 > 权限管理 > 应用 > 目标应用`);
          let err: BusinessError = {
            message: `用户拒绝授权`,
            code: 401,
            name: `用户拒绝授权`
          }
          reject(err);
          return;
        }
      }
    }).catch((err: BusinessError) => {
      CSLogger.info(TAG, `Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
      reject(err);
    })
  });
}

----------------- end ---------------

后面会继续补充不足之处。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。