鸿蒙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}`);
  }
}
相关推荐
爬虫程序猿5 小时前
利用爬虫按关键字搜索淘宝商品实战指南
android·爬虫
顾北川_野6 小时前
Android ttyS2无法打开该如何配置 + ttyS0和ttyS1可以
android·fpga开发
前端世界7 小时前
鸿蒙UI开发全解:JS与Java双引擎实战指南
javascript·ui·harmonyos
wzj_what_why_how9 小时前
Android网络层架构:统一错误处理的问题分析到解决方案与设计实现
android·架构
千里马学框架9 小时前
User手机上如何抓取界面的布局uiautomatorviewer
android·智能手机·aosp·uiautomator·布局抓取·user版本
阿巴~阿巴~9 小时前
操作系统核心技术剖析:从Android驱动模型到鸿蒙微内核的国产化实践
android·华为·harmonyos
Engandend10 小时前
Flutter与iOS混合开发交互
flutter·ios·程序员
iMerryou10 小时前
鸿蒙的动态渐变背景实现
harmonyos
hsx66610 小时前
使用 MaterialShapeDrawable 自定义各种形状的 View
android
用户20187928316711 小时前
滑动城堡的奇妙管家 ——ViewPager故事
android