HarmonyOS鸿蒙Next中应用权限校验、授权工具封装

HarmonyOS鸿蒙Next中应用权限校验、授权工具封装

1.检查是否授权

import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';

/**
 * 检查是否授权
 * @param permissions
 */
checkPermissions(permissions: Permissions[]) {
  // 1. 创建应用权限管理器
  const atManager = abilityAccessCtrl.createAtManager();
  // 2. 获取 bundle 包信息
  const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  // 3. 提取 tokenID 应用唯一标识
  const tokenID = bundleInfo.appInfo.accessTokenId;
  // 检查权限或者权限组授权结果
  const authResult = permissions.map(item => atManager.checkAccessTokenSync(tokenID, item))
  // 检查每一项是否都授权
  return authResult.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
}

2.动态申请权限(首次弹窗申请)

/**
 * 动态申请权限(首次弹窗申请)
 * @param permissions
 */
async requestPermissions(permissions: Permissions[]) {
  // 程序访问控制管理
  const atManager = abilityAccessCtrl.createAtManager();
  // 拉起弹框请求用户授权
  const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions)
  // 获取请求权限的结果
  const isAuth = grantStatus.authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  // 返回Promise结果
  return isAuth ? Promise.resolve(true) : Promise.reject(false)
}

1.打开系统设置的权限管理页

/**
 * 打开系统设置的权限管理页(处理授权结果)
 */
openPermissionSettingsPage() {
  const context = getContext() as common.UIAbilityContext
  const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  // 跳转系统设置页
  context.startAbility({
    bundleName: 'com.huawei.hmos.settings', // 固定写法CV:设置页的包名
    abilityName: 'com.huawei.hmos.settings.MainAbility', // 固定写法CV:设置页的 ability 名
    uri: 'application_info_entry', // 固定写法CV:打开 设置->应用和元服务
    parameters: {
      // 按照包名打开对应设置页
      pushParams: bundleInfo.name
    }
  })
}

更多关于HarmonyOS鸿蒙Next中应用权限校验、授权工具封装的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,应用权限校验和授权工具封装可以使用@ohos.abilityAccessCtrl模块实现。权限校验通过atManager.verifyAccessToken()同步检查当前应用是否具备指定权限,返回PERMISSION_GRANTEDPERMISSION_DENIED。动态授权需调用requestPermissionsFromUser()异步申请,结果通过回调返回。工具类封装示例:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
class PermissionUtil {
  static checkPermission(permission: string): boolean {
    const atManager = abilityAccessCtrl.createAtManager();
    return atManager.verifyAccessToken(abilityAccessCtrl.AccessTokenID.BASE, permission) === 0;
  }
}

注意:需先在module.json5中声明需要的权限。

更多关于HarmonyOS鸿蒙Next中应用权限校验、授权工具封装的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,您提供的权限管理封装代码是正确且完整的实现方案。以下是对代码的几点技术分析:

  1. 权限检查部分:
  • 使用createAtManager()创建权限管理器实例
  • 通过getBundleInfoForSelfSync获取当前应用信息
  • 使用checkAccessTokenSync同步检查权限状态
  • 正确判断了PERMISSION_GRANTED状态
  1. 动态申请权限部分:
  • 规范使用了requestPermissionsFromUser异步API
  • 正确处理了授权结果数组
  • 返回Promise便于链式调用
  1. 系统设置跳转部分:
  • 正确使用了Settings应用的固定包名和Ability名
  • 通过parameters传递当前包名实现精准跳转

建议可以进一步封装成工具类,加入以下优化:

  1. 增加权限类型校验
  2. 添加失败回调处理
  3. 记录权限请求日志
  4. 实现权限使用说明的自动展示

这些代码可以直接用于生产环境,符合HarmonyOS的权限管理规范。

回到顶部