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

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

TypeScript 复制代码
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>
}
相关推荐
Goway_Hui1 小时前
【ReactNative鸿蒙化-三方库使用与C-API集成】
c语言·react native·harmonyos
nashane2 小时前
HarmonyOS 6.0 分布式相机实战:调用远端设备摄像头与AI场景识别(API 11+)
分布式·数码相机·harmonyos·harmonyos 5
Huanzhi_Lin2 小时前
鸿蒙NEXT出包
华为·harmonyos·鸿蒙·harmony·鸿蒙next·hap
luoganttcc3 小时前
华为昇腾(Ascend)等芯片,同样存在“寄存器 / 片上存储资源限制并发”的问题
算法·华为
╰つ栺尖篴夢ゞ3 小时前
HarmonyOS Next面试题之主线程与子线程访问同一个单例,获取的对象是同一个吗?
单例模式·多线程·harmonyos·sendable·actor模型·内存隔离
南村群童欺我老无力.4 小时前
鸿蒙PC开发的@Builder函数闭合大括号的隐形杀手
华为·harmonyos
花先锋队长5 小时前
从静态到“AI动态”:华为Pura X Max独家首发AI动态漫画再创阅读新体验
科技·华为·harmonyos
Lanren的编程日记5 小时前
Flutter 鸿蒙应用错误处理优化实战:完善全局异常捕获,全方位提升应用稳定性
flutter·华为·harmonyos
Lanren的编程日记5 小时前
Flutter鸿蒙应用开发:网络请求优化实战,全方位提升请求稳定性与性能
网络·flutter·harmonyos
IntMainJhy6 小时前
【futter for open harmony】Flutter 鸿蒙聊天应用实战:shared_preferences 本地键值存储适配指南[特殊字符]
flutter·华为·harmonyos