鸿蒙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}`);
  }
}
相关推荐
xiangpanf13 分钟前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx3 小时前
安卓线程相关
android
RickeyBoy3 小时前
独立 App 配置阿里云 CDN 记录
ios
消失的旧时光-19434 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon4 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon5 小时前
VSYNC 信号完整流程2
android
dalancon5 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
不爱吃糖的程序媛5 小时前
OpenHarmony 工程结构剖析
harmonyos
白玉cfc6 小时前
接口与API设计
ios·objective-c
用户69371750013846 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能