首页 鸿蒙 正文
  • 本文约2068字,阅读需10分钟
  • 61
  • 0

鸿蒙开发封装权限管理 检测是否授权 动态申请授权的 打开系统设置

温馨提示:本文最后更新于2024年10月17日 20:29,若内容或图片失效,请在下方留言或联系博主。

检测是否授权 动态申请授权的 打开系统设置

// 封装一个 检测是否授权 动态申请授权的 打开系统设置的权限管理页(处理授权结果)
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';

class PermissionManager {
  // 检查是否授权
  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
    // 4. 核心 API (因为想一次传递多个 所哟使用一个数组 map 挨个进项权限检测)
    const grantStatus = permissions.map((item) => {
      return atManager.checkAccessTokenSync(tokenID, item)
    })
    // 5. 返回授权状态
    // every (条件) 遍历时所有条件都成立 返回 true 有一个不成立就返回 false
    // i => i == 0 也可以 只不过不标准,使用 abilityAccessCtrl 中有一个枚举值(更加正规)
    return grantStatus.every(i => i == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  }

  // 动态申请授权(首次弹窗申请)
  async requestPermissions(permissions: Permissions[]) {
    // 1. 程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager()
    // 2. 动态向用户申请授权 ---获取上下文   数组格式的授权列表
    const requestResult = await atManager.requestPermissionsFromUser(getContext(), permissions)
    // 3. 判断是否成功---(abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED == 0 )
    const isAuth = requestResult.authResults.every(i => i == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    // 4. 返回 授权状态
    // Promise.resolve(true)   标识成功, await 后面的代码可以继续执行
    // Promise.reject(false)   标识失败, await 后面的代码不会继续执行(并可以通过过 try()catch() 捕获到 reject的错误 信息)
    return isAuth == true ? Promise.resolve(true) : Promise.reject(false)
  }

  // 打开系统设置的权限管理页(处理授权结果)
  openPermissionSettingsPage() {
    // 获取上下文
    const context = getContext() as common.UIAbilityContext
    // 获取包信息 (动态获取 AppScope/app.json5 中的配置包信息) -- "bundleName": "com.itheima.hm_guardian",
    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: {
        // 按照包名打开对应设置页(对应的详情页面) -- "bundleName": "com.itheima.hm_guardian",
        pushParams: bundleInfo.name
      }
    })
  }
}

// 导出 Manager
export const permissionManager = new PermissionManager()
评论