HarmonyOS鸿蒙Next用户授权工具类封装

用户权限工具类封装

前言

在HarmonyOS鸿蒙Next开发应用中应经常会出现一些操作,需要用户进行授权 比如相机 文件读写 地图 等权限 需要判断用户是否已经授权 没授权进行授权 二次授权 基本上在每个app都会又用到, 为了方便使用 我给权限所需要用到的事件进行了工具类的的封装

参考资料官方文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V14/js-apis-abilityaccessctrl-V14?catalogVersion=V14

PermissionUtil 工具类

export class PermissionUtil {

  /**
   * 校验当前是否已经授权
   * @param permissions 待判断的权限
   * @returns 已授权true,未授权false
   */
  static async checkPermissions(permissions: Permissions): Promise<boolean> {
    let grantStatus: abilityAccessCtrl.GrantStatus = await PermissionUtil.checkAccessToken(permissions);
    if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { //判断是否授权
      return true; //已经授权
    } else {
      return false; //未授权
    }
  }

  /**
   * 校验是否授权后并申请授权。
   * @param permissions 需要授权的权限
   * @returns true表示授权成功继续业务操作,false表示用户拒绝授权
   */
  static async checkRequestPermissions(permissions: Permissions): Promise<boolean> {
    let checkStatus = await PermissionUtil.checkPermissions(permissions);
    if (checkStatus) {
      return checkStatus;
    } else {
      return await PermissionUtil.requestPermissions(permissions);
    }
  }

  /**
   * 申请授权(支持权限组合)
   * @param permissions 需要授权的权限
   * @returns true表示授权成功继续业务操作,false表示用户拒绝授权
   */
  static async requestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let context: Context = getContext() as common.UIAbilityContext;
    //requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
    let request = await atManager.requestPermissionsFromUser(context,
      Array.isArray(permissions) ? [...permissions] : [permissions]);
    let requestGrant: boolean = PermissionUtil.getGrantSuccess(request); //鉴权结果
    return requestGrant;
  }

  /**
   * 申请授权,拒绝后并二次向用户申请授权(申请权限,建议使用该方法)。
   * @param permissions
   * @returns
   */
  static async requestPermissionsEasy(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let context: Context = getContext() as common.UIAbilityContext;
    let ps: Array<Permissions> = Array.isArray(permissions) ? [...permissions] : [permissions];
    //requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
    let request = await atManager.requestPermissionsFromUser(context, ps);
    let requestGrant: boolean = PermissionUtil.getGrantSuccess(request); //鉴权结果
    if (requestGrant) {
      return requestGrant;
    } else {
      return await PermissionUtil.requestPermissionOnSettingEasy(ps); //二次向用户申请授权
    }
  }

  /**
   * 二次向用户申请授权(单个权限 或 读写权限组,建议使用该方法)。
   * @param permissions 需要授权的权限集合
   * @returns true表示授权成功继续业务操作,false表示用户拒绝授权
   */
  static async requestPermissionOnSetting(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let context: Context = getContext() as common.UIAbilityContext;
    //requestPermissionOnSetting会判断权限的授权状态来决定是否唤起弹窗
    let grantStatus = await atManager.requestPermissionOnSetting(context,
      Array.isArray(permissions) ? [...permissions] : [permissions]);
    let result: boolean = PermissionUtil.getGrantSuccess(grantStatus); //鉴权结果
    return result;
  }

  /**
   * 二次向用户申请授权(多个权限建议使用该方法)。
   * @param permissions 需要授权的权限集合
   */
  static async requestPermissionOnSettingEasy(permissions: Array<Permissions>): Promise<boolean> {
    for (let i = 0; i < permissions.length; i++) {
      let check = await PermissionUtil.checkPermissions(permissions[i]); //判断是否授权。
      if (!check) { //未授权,二次向用户申请授权。
        let grant = await PermissionUtil.requestPermissionOnSetting(permissions[i]);
        if (!grant) { //二次向用户申请授权,拒绝后,直接返回false。
          return false;
        }
      }
    }
    return true;
  }

  /**
   * 判断是否授权成功
   */
  private static getGrantSuccess(data: PermissionRequestResult | Array<abilityAccessCtrl.GrantStatus>): boolean {
    let result: boolean = true; //鉴权结果
    let grantStatus: Array<number> = Array.isArray(data) ? data : data.authResults;
    for (let i = 0; i < grantStatus.length; i++) {
      if (grantStatus[i] !== abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
        result = false; //用户未授权授权 或 拒绝授权。
      }
    }
    return result;
  }

  /**
   * 检查是否授权
   * @param permission 待检查权限
   * @returns 授权状态
   */
  private static async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    let tokenId: number = 0; //获取应用程序的accessTokenID
    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;
      ToastUtil.showToast('获取应用信息失败:' + err.message);
    }
    //校验应用是否被授予权限
    try {
      grantStatus = await atManager.checkAccessToken(tokenId, permission);
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      ToastUtil.showToast('校验授权信息失败:' + err.message);
    }
    return grantStatus;
  }
}

更多关于HarmonyOS鸿蒙Next用户授权工具类封装的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next用户授权工具类封装的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,用户授权工具类的封装可以通过以下步骤实现:

  1. 创建工具类:定义一个PermissionUtil类,用于封装权限请求和管理逻辑。

  2. 权限检查:使用AbilityContextverifySelfPermission方法检查应用是否拥有指定权限。

  3. 权限请求:通过AbilityContextrequestPermissionsFromUser方法请求用户授权。

  4. 回调处理:在onRequestPermissionsResult方法中处理用户授权结果,并根据结果执行相应操作。

  5. 封装方法:提供checkPermissionrequestPermission等方法,简化权限管理流程。

通过封装,开发者可以更方便地管理应用权限,提升代码复用性和可维护性。

回到顶部