鸿蒙NEXT开发权限工具类(申请授权相关)(ArkTs)

复制代码
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import { bundleManager, common, PermissionRequestResult } from '@kit.AbilityKit';
import { BusinessError } from '@ohos.base';
import { ToastUtil } from './ToastUtil';

/**
 * 权限工具类(申请授权相关)
 * author: CSDN-鸿蒙布道师
 * since: 2025/04/22
 */
export class PermissionUtil {
  /**
   * 获取应用上下文
   */
  private static getContext(): common.UIAbilityContext {
    return getContext() as common.UIAbilityContext;
  }

  /**
   * 创建权限管理器实例
   */
  private static createAtManager(): abilityAccessCtrl.AtManager {
    return abilityAccessCtrl.createAtManager();
  }

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

  /**
   * 校验并申请权限
   * @param permissions 需要授权的权限
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async checkAndRequestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    const isGranted = await PermissionUtil.checkPermissions(permissions as Permissions);
    if (isGranted) {
      return true;
    }
    return PermissionUtil.requestPermissionsEasy(permissions);
  }

  /**
   * 申请权限(支持单个或多个权限组合)
   * @param permissions 需要授权的权限
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async requestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    const atManager = PermissionUtil.createAtManager();
    const context = PermissionUtil.getContext();
    const permissionArray = Array.isArray(permissions) ? [...permissions] : [permissions];

    try {
      const result = await atManager.requestPermissionsFromUser(context, permissionArray);
      return PermissionUtil.isPermissionGranted(result);
    } catch (error) {
      PermissionUtil.handleError(error, '申请权限失败');
      return false;
    }
  }

  /**
   * 申请权限并提供二次授权机会(推荐使用此方法)
   * @param permissions 需要授权的权限
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async requestPermissionsEasy(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    const granted = await PermissionUtil.requestPermissions(permissions);
    if (granted) {
      return true;
    }
    return PermissionUtil.requestPermissionOnSettingEasy(
      Array.isArray(permissions) ? [...permissions] : [permissions]
    );
  }

  /**
   * 二次向用户申请权限(适用于单个权限或读写权限组)
   * @param permissions 需要授权的权限集合
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async requestPermissionOnSetting(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    const atManager = PermissionUtil.createAtManager();
    const context = PermissionUtil.getContext();
    const permissionArray = Array.isArray(permissions) ? [...permissions] : [permissions];

    try {
      const result = await atManager.requestPermissionOnSetting(context, permissionArray);
      return PermissionUtil.isPermissionGranted(result);
    } catch (error) {
      PermissionUtil.handleError(error, '二次申请权限失败');
      return false;
    }
  }

  /**
   * 二次向用户申请权限(适用于多个权限)
   * @param permissions 需要授权的权限集合
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async requestPermissionOnSettingEasy(permissions: Array<Permissions>): Promise<boolean> {
    for (const permission of permissions) {
      const isGranted = await PermissionUtil.checkPermissions(permission);
      if (!isGranted) {
        const granted = await PermissionUtil.requestPermissionOnSetting(permission);
        if (!granted) {
          return false;
        }
      }
    }
    return true;
  }

  /**
   * 检查权限是否已授予
   * @param data 授权结果
   * @returns true 表示所有权限均已授予,false 表示存在未授予权限
   */
  private static isPermissionGranted(data: PermissionRequestResult | Array<number>): boolean {
    const authResults = Array.isArray(data) ? data : data.authResults;
    return authResults.every((status) => status === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);
  }

  /**
   * 校验访问令牌是否已授权
   * @param permission 待检查权限
   * @returns 授权状态
   */
  private static async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
    const atManager = PermissionUtil.createAtManager();
    let tokenId = 0;

    try {
      const bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      tokenId = bundleInfo.appInfo.accessTokenId;
    } catch (error) {
      PermissionUtil.handleError(error, '获取应用信息失败');
      return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    }

    try {
      return await atManager.checkAccessToken(tokenId, permission);
    } catch (error) {
      PermissionUtil.handleError(error, '校验授权信息失败');
      return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    }
  }

  /**
   * 错误处理方法
   * @param error 错误对象(明确指定为 BusinessError 类型)
   * @param message 提示信息
   */
  private static handleError(error: BusinessError, message: string): void {
    console.error(`${message}: ${error.message}`);
    ToastUtil.showToast(`${message}: ${error.message}`);
  }
}

代码如下:
TypeScript 复制代码
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import { bundleManager, common, PermissionRequestResult } from '@kit.AbilityKit';
import { BusinessError } from '@ohos.base';
import { ToastUtil } from './ToastUtil';

/**
 * 权限工具类(申请授权相关)
 * author: CSDN-鸿蒙布道师
 * since: 2025/04/22
 */
export class PermissionUtil {
  /**
   * 获取应用上下文
   */
  private static getContext(): common.UIAbilityContext {
    return getContext() as common.UIAbilityContext;
  }

  /**
   * 创建权限管理器实例
   */
  private static createAtManager(): abilityAccessCtrl.AtManager {
    return abilityAccessCtrl.createAtManager();
  }

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

  /**
   * 校验并申请权限
   * @param permissions 需要授权的权限
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async checkAndRequestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    const isGranted = await PermissionUtil.checkPermissions(permissions as Permissions);
    if (isGranted) {
      return true;
    }
    return PermissionUtil.requestPermissionsEasy(permissions);
  }

  /**
   * 申请权限(支持单个或多个权限组合)
   * @param permissions 需要授权的权限
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async requestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    const atManager = PermissionUtil.createAtManager();
    const context = PermissionUtil.getContext();
    const permissionArray = Array.isArray(permissions) ? [...permissions] : [permissions];

    try {
      const result = await atManager.requestPermissionsFromUser(context, permissionArray);
      return PermissionUtil.isPermissionGranted(result);
    } catch (error) {
      PermissionUtil.handleError(error, '申请权限失败');
      return false;
    }
  }

  /**
   * 申请权限并提供二次授权机会(推荐使用此方法)
   * @param permissions 需要授权的权限
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async requestPermissionsEasy(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    const granted = await PermissionUtil.requestPermissions(permissions);
    if (granted) {
      return true;
    }
    return PermissionUtil.requestPermissionOnSettingEasy(
      Array.isArray(permissions) ? [...permissions] : [permissions]
    );
  }

  /**
   * 二次向用户申请权限(适用于单个权限或读写权限组)
   * @param permissions 需要授权的权限集合
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async requestPermissionOnSetting(permissions: Permissions | Array<Permissions>): Promise<boolean> {
    const atManager = PermissionUtil.createAtManager();
    const context = PermissionUtil.getContext();
    const permissionArray = Array.isArray(permissions) ? [...permissions] : [permissions];

    try {
      const result = await atManager.requestPermissionOnSetting(context, permissionArray);
      return PermissionUtil.isPermissionGranted(result);
    } catch (error) {
      PermissionUtil.handleError(error, '二次申请权限失败');
      return false;
    }
  }

  /**
   * 二次向用户申请权限(适用于多个权限)
   * @param permissions 需要授权的权限集合
   * @returns true 表示授权成功,false 表示用户拒绝授权
   */
  static async requestPermissionOnSettingEasy(permissions: Array<Permissions>): Promise<boolean> {
    for (const permission of permissions) {
      const isGranted = await PermissionUtil.checkPermissions(permission);
      if (!isGranted) {
        const granted = await PermissionUtil.requestPermissionOnSetting(permission);
        if (!granted) {
          return false;
        }
      }
    }
    return true;
  }

  /**
   * 检查权限是否已授予
   * @param data 授权结果
   * @returns true 表示所有权限均已授予,false 表示存在未授予权限
   */
  private static isPermissionGranted(data: PermissionRequestResult | Array<number>): boolean {
    const authResults = Array.isArray(data) ? data : data.authResults;
    return authResults.every((status) => status === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);
  }

  /**
   * 校验访问令牌是否已授权
   * @param permission 待检查权限
   * @returns 授权状态
   */
  private static async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
    const atManager = PermissionUtil.createAtManager();
    let tokenId = 0;

    try {
      const bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      tokenId = bundleInfo.appInfo.accessTokenId;
    } catch (error) {
      PermissionUtil.handleError(error, '获取应用信息失败');
      return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    }

    try {
      return await atManager.checkAccessToken(tokenId, permission);
    } catch (error) {
      PermissionUtil.handleError(error, '校验授权信息失败');
      return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    }
  }

  /**
   * 错误处理方法
   * @param error 错误对象(明确指定为 BusinessError 类型)
   * @param message 提示信息
   */
  private static handleError(error: BusinessError, message: string): void {
    console.error(`${message}: ${error.message}`);
    ToastUtil.showToast(`${message}: ${error.message}`);
  }
}
相关推荐
summerkissyou19873 小时前
Android - 摄像头 - hal - 开发教程,例子,常见问题,分析方法,解决方案
android
summerkissyou19874 小时前
Android 16 架构图
android
神龙天舞20014 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
FF2501_940228585 小时前
HarmonyOS应用开发实战:猫猫大作战-在排行榜和历史记录查询中,排序是必不可少的操作【apple_product_name】
华为·harmonyos·鸿蒙
码农coding7 小时前
android12 systemUI 之锁屏
android
AI云海7 小时前
iOS 多 Target 打包、UAT/生产测试与上架 App Store 全流程指南
ios
圆山猫7 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
爱笑鱼8 小时前
Binder(七):getCallingUid() 读到的是谁?clearCallingIdentity() 又清掉了什么?
android
阿里超级工程师9 小时前
最新快速申请ios打包证书和profile文件步骤
ios·打包证书
程序员黑豆9 小时前
鸿蒙应用开发:@Provider 与 @Consumer 跨组件双向同步详解
前端·harmonyos