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}`);
}
}