HarmonyOS —— 仿 XPermission 鸿蒙权限申请工具类

 仿 XPermission 写一个简单的鸿蒙权限申请工具类。

import { abilityAccessCtrl, bundleManager, Context, Permissions } from '@kit.AbilityKit'
import { ArrayList } from '@kit.ArkTS'

export class PermissionUtil {
  private static readonly sUtil: PermissionUtil = new PermissionUtil()
  private mAtManager: abilityAccessCtrl.AtManager
  private mTokenId: number
  private mContext?: Context
  private mPermissions: ArrayList<Permissions> = new ArrayList()

  constructor() {
    this.mAtManager = abilityAccessCtrl.createAtManager()
    let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    this.mTokenId = bundleInfo.appInfo.accessTokenId
  }

  public static init(context: Context): PermissionUtil {
    PermissionUtil.sUtil.mContext = context
    return PermissionUtil.sUtil
  }

  public addPermissions(permission: Permissions): PermissionUtil {
    this.mPermissions.add(permission)
    return PermissionUtil.sUtil
  }


  /**
   * 检测并申请权限
   * @returns 
   */
  async request() {
    return new Promise<RequestResult>((resolve, reject) => {
      //如果开发者没有添加权限则抛出异常
      if (this.mPermissions.length === 0) {
        reject(Error("请添加权限"))
        return
      }
      //克隆开发添加的权限
      let temp = this.mPermissions.clone()
      let grantedList: ArrayList<Permissions> = new ArrayList()
      let deniedList: ArrayList<Permissions> = new ArrayList()
      //遍历开发者添加的权限是否已经授权,如果已经授权则移出列表
      this.mPermissions.forEach((permission) => {
        let result = this.checkPermission(permission)
        if (result) {
          //从临时列表里面移出
          temp.remove(permission)
          //添加到已授权权限列表
          this.push(permission, grantedList)
        }
      })
      //如果列表长度为 0 则表示权限已经全部授权,直接返回.否则对未授权的权限进行权限申请
      if (temp.length === 0) {
        resolve({ allGranted: true, grantedList, deniedList })
      } else {
        this.mAtManager.requestPermissionsFromUser(this.mContext, temp.convertToArray(), (error, requestResult) => {
          if (error) {
            //申请权限出错,抛出异常
            reject(error)
          } else {
            //对授权结果进行分类
            requestResult.authResults.forEach((authResult, index) => {
              if (authResult === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
                this.push(requestResult.permissions[index] as Permissions, grantedList)
              } else {
                this.push(requestResult.permissions[index] as Permissions, deniedList)
              }
              resolve({ allGranted: deniedList.length === 0, grantedList, deniedList })
            })
          }
        })
      }
    })
  }

  /**
   * add 数据前查重
   * @param element
   * @param arrayList
   */
  private push<T>(element: T, arrayList: ArrayList<T>) {
    if (!arrayList.has(element)) {
      arrayList.add(element)
    }
  }

  private checkPermission(permission: Permissions): boolean {
    let result = this.mAtManager.checkAccessTokenSync(this.mTokenId, permission)
    return result === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED
  }
}

interface RequestResult {
  allGranted: boolean
  grantedList: ArrayList<Permissions>
  deniedList: ArrayList<Permissions>
}

相关推荐

  1. HarmonyOS —— 仿 XPermission 鸿蒙权限申请工具

    2024-04-25 09:08:03       15 阅读
  2. HarmonyOS Stage模型 权限申请

    2024-04-25 09:08:03       28 阅读
  3. 鸿蒙开发之用户隐私权限申请

    2024-04-25 09:08:03       34 阅读
  4. 【Unity】动态申请权限

    2024-04-25 09:08:03       61 阅读
  5. Android权限申请

    2024-04-25 09:08:03       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-25 09:08:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-25 09:08:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-25 09:08:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-25 09:08:03       18 阅读

热门阅读

  1. 一个缓存泛型自动处理队列,留有处理事件接口

    2024-04-25 09:08:03       15 阅读
  2. 网络安全之WebShell截获

    2024-04-25 09:08:03       15 阅读
  3. Apollo 9.0 aem;buildtool

    2024-04-25 09:08:03       13 阅读
  4. 标定系列——OpenCV中CV_16S的常用场合(二十六)

    2024-04-25 09:08:03       15 阅读
  5. js音频指定扬声器

    2024-04-25 09:08:03       13 阅读
  6. 构建数据驱动的文化价值体系,还得靠数据分析

    2024-04-25 09:08:03       16 阅读
  7. 每天一个数据分析题(二百九十)

    2024-04-25 09:08:03       14 阅读
  8. React的Key和diff

    2024-04-25 09:08:03       12 阅读