HarmonyOS鸿蒙Next用户授权工具类封装
用户权限工具类封装
前言
在HarmonyOS鸿蒙Next开发应用中应经常会出现一些操作,需要用户进行授权 比如相机 文件读写 地图 等权限 需要判断用户是否已经授权 没授权进行授权 二次授权 基本上在每个app都会又用到, 为了方便使用 我给权限所需要用到的事件进行了工具类的的封装
参考资料官方文档:
PermissionUtil 工具类
export class PermissionUtil {
/**
* 校验当前是否已经授权
* @param permissions 待判断的权限
* @returns 已授权true,未授权false
*/
static async checkPermissions(permissions: Permissions): Promise<boolean> {
let grantStatus: abilityAccessCtrl.GrantStatus = await PermissionUtil.checkAccessToken(permissions);
if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { //判断是否授权
return true; //已经授权
} else {
return false; //未授权
}
}
/**
* 校验是否授权后并申请授权。
* @param permissions 需要授权的权限
* @returns true表示授权成功继续业务操作,false表示用户拒绝授权
*/
static async checkRequestPermissions(permissions: Permissions): Promise<boolean> {
let checkStatus = await PermissionUtil.checkPermissions(permissions);
if (checkStatus) {
return checkStatus;
} else {
return await PermissionUtil.requestPermissions(permissions);
}
}
/**
* 申请授权(支持权限组合)
* @param permissions 需要授权的权限
* @returns true表示授权成功继续业务操作,false表示用户拒绝授权
*/
static async requestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = getContext() as common.UIAbilityContext;
//requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
let request = await atManager.requestPermissionsFromUser(context,
Array.isArray(permissions) ? [...permissions] : [permissions]);
let requestGrant: boolean = PermissionUtil.getGrantSuccess(request); //鉴权结果
return requestGrant;
}
/**
* 申请授权,拒绝后并二次向用户申请授权(申请权限,建议使用该方法)。
* @param permissions
* @returns
*/
static async requestPermissionsEasy(permissions: Permissions | Array<Permissions>): Promise<boolean> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = getContext() as common.UIAbilityContext;
let ps: Array<Permissions> = Array.isArray(permissions) ? [...permissions] : [permissions];
//requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
let request = await atManager.requestPermissionsFromUser(context, ps);
let requestGrant: boolean = PermissionUtil.getGrantSuccess(request); //鉴权结果
if (requestGrant) {
return requestGrant;
} else {
return await PermissionUtil.requestPermissionOnSettingEasy(ps); //二次向用户申请授权
}
}
/**
* 二次向用户申请授权(单个权限 或 读写权限组,建议使用该方法)。
* @param permissions 需要授权的权限集合
* @returns true表示授权成功继续业务操作,false表示用户拒绝授权
*/
static async requestPermissionOnSetting(permissions: Permissions | Array<Permissions>): Promise<boolean> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = getContext() as common.UIAbilityContext;
//requestPermissionOnSetting会判断权限的授权状态来决定是否唤起弹窗
let grantStatus = await atManager.requestPermissionOnSetting(context,
Array.isArray(permissions) ? [...permissions] : [permissions]);
let result: boolean = PermissionUtil.getGrantSuccess(grantStatus); //鉴权结果
return result;
}
/**
* 二次向用户申请授权(多个权限建议使用该方法)。
* @param permissions 需要授权的权限集合
*/
static async requestPermissionOnSettingEasy(permissions: Array<Permissions>): Promise<boolean> {
for (let i = 0; i < permissions.length; i++) {
let check = await PermissionUtil.checkPermissions(permissions[i]); //判断是否授权。
if (!check) { //未授权,二次向用户申请授权。
let grant = await PermissionUtil.requestPermissionOnSetting(permissions[i]);
if (!grant) { //二次向用户申请授权,拒绝后,直接返回false。
return false;
}
}
}
return true;
}
/**
* 判断是否授权成功
*/
private static getGrantSuccess(data: PermissionRequestResult | Array<abilityAccessCtrl.GrantStatus>): boolean {
let result: boolean = true; //鉴权结果
let grantStatus: Array<number> = Array.isArray(data) ? data : data.authResults;
for (let i = 0; i < grantStatus.length; i++) {
if (grantStatus[i] !== abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
result = false; //用户未授权授权 或 拒绝授权。
}
}
return result;
}
/**
* 检查是否授权
* @param permission 待检查权限
* @returns 授权状态
*/
private static async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
let tokenId: number = 0; //获取应用程序的accessTokenID
try {
let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
tokenId = appInfo.accessTokenId;
} catch (error) {
const err: BusinessError = error as BusinessError;
ToastUtil.showToast('获取应用信息失败:' + err.message);
}
//校验应用是否被授予权限
try {
grantStatus = await atManager.checkAccessToken(tokenId, permission);
} catch (error) {
const err: BusinessError = error as BusinessError;
ToastUtil.showToast('校验授权信息失败:' + err.message);
}
return grantStatus;
}
}
更多关于HarmonyOS鸿蒙Next用户授权工具类封装的实战教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于HarmonyOS鸿蒙Next用户授权工具类封装的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,用户授权工具类的封装可以通过以下步骤实现:
-
创建工具类:定义一个
PermissionUtil
类,用于封装权限请求和管理逻辑。 -
权限检查:使用
AbilityContext
的verifySelfPermission
方法检查应用是否拥有指定权限。 -
权限请求:通过
AbilityContext
的requestPermissionsFromUser
方法请求用户授权。 -
回调处理:在
onRequestPermissionsResult
方法中处理用户授权结果,并根据结果执行相应操作。 -
封装方法:提供
checkPermission
和requestPermission
等方法,简化权限管理流程。
通过封装,开发者可以更方便地管理应用权限,提升代码复用性和可维护性。