鸿蒙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}`);
  }
}
相关推荐
android_xc1 小时前
Android Studio适配butterknife遇到的坑
android·ide·android studio·butterknife
2501_915918411 小时前
uni-app 项目 iOS 上架效率优化 从工具选择到流程改进的实战经验
android·ios·小程序·uni-app·cocoa·iphone·webview
Cheney8221 小时前
华为Ai岗机考20250903完整真题
人工智能·华为
00后程序员张2 小时前
如何在不同 iOS 设备上测试和上架 uni-app 应用 实战全流程解析
android·ios·小程序·https·uni-app·iphone·webview
wjm0410062 小时前
ios面试八股文
ios·面试
米豆同学3 小时前
SufraceFlinger图像合成原理(3)-SurfaceFlinger中Layer的创建和销毁
android
米豆同学3 小时前
SufraceFlinger图像合成原理(2)-SurfaceFlinger与应用进程间的通信
android
用户2018792831673 小时前
uses-library:系统应用报NoClassDefFoundError问题
android
叽哥3 小时前
Kotlin学习第 4 课:Kotlin 函数:从基础定义到高阶应用
android·java·kotlin
mg6683 小时前
安卓玩机工具----安卓“搞机工具箱”最新版 控制手机的玩机工具
android·智能手机