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}`);}
}代码如下:
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}`);}
}