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>
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/569230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

齐护K210系列教程(四)_串口输出

串口输出打印数据 文章目录 串口输出打印数据1&#xff0c;什么是串口通信2&#xff0c;串口通常的应用3&#xff0c;AIstart的串口编程3-1 打印数据输出3-2 打印数据输出与输入 4&#xff0c;课程资源 1&#xff0c;什么是串口通信 在设计程序的过程中&#xff0c;经常要查看…

【中邦兴业】如何进行气流流型测试?一篇文章告诉你

气流流型&#xff0c;作为反应无菌操作的关键测试&#xff0c;其测试方法和结果是否合理直接关系到无菌保障水平是否达到要求。一个科学的气流流型设计&#xff0c;能够正确反应关键区域和关键操作下的气流流动是否符合要求&#xff0c;能否有效减少产品微生物的污染风险。如今…

Redis系列:内存淘汰策略

1 前言 通过前面的一些文章我们知道&#xff0c;Redis的各项能力是基于内存实现的&#xff0c;相对其他的持久化存储&#xff08;如MySQL、File等&#xff0c;数据持久化在磁盘上&#xff09;&#xff0c;性能会高很多&#xff0c;这也是高速缓存的一个优势。 但是问题来了&am…

【预测】小米汽车电子电气架构的猜想

文章目录 前言 整车EEA 硬件平台 软件平台 总结 参考资料 前言 见《【Review】小米汽车发布会》 整车EEA 小米汽车整车电子电气架构方面的信息&#xff0c;小米官方并没有对外介绍&#xff0c;但是从近日流出的整车BOM和供应商列表中看到&#xff0c;车上各种控制器一个都…

地下停车场FM覆盖系统技术方案

一、整体思路 根据我公司现场勘查与交流结果&#xff0c;建议采用数字选频模拟拉远的方式进行组网&#xff0c;建议采用我公司研发的一体化直放站&#xff0c;该直放站采用直放站与天线一体化设计&#xff0c;大大降低安装施工工作量&#xff0c;减少布线量&#xff0c;减少维护…

全新Storm Core API管理系统源码 免授权版

全新Storm Core API管理系统源码 免授权版 本系统为API系统,实现了api集成等基础功能,以后可能会更新key调用api,或者实现付费功能,敬请期待,前端模板均无加密,用户可自行二开,具体请看图 测试环境:PHP7.2+MySQL5.6 访问:http://你的域名/install 进行安装 伪静态…

已注册商标的交易要避开哪些坑?

有些主体急用商标&#xff0c;比如上平台和投放&#xff0c;或者是申请注册驳回或者是没有申请注册好名称&#xff0c;普推知产老杨建议在交易已注册商标要注意避开这些坑。 一是看有没有大持有量&#xff0c;如果转让人持有商标的量特别大&#xff0c;特别是一对多&#xff0c…

e2e测试框架之Cypress

谈起web自动化测试&#xff0c;大家首先想到的是Selenium&#xff01;随着近几年前端技术的发展&#xff0c;出现了不少前端测试框架&#xff0c;这些测试框架大多并不依赖于Selenium&#xff0c;这一点跟后端测试框架有很大不同&#xff0c;如Robot Framework做Web自动化测试本…

ArcGIS教程:降雨量插值

一、目标 制作一副年平均降雨量的地图。 二、数据 某地的175个气象站数据的shp文件station.shp&#xff0c;以及这个地方轮廓的栅格数据idoutlgd。 数据下载链接&#xff1a;数据下载链接 三、制作方法 1.首先加载数据。 2.在菜单栏/customize/toolbars/中找到geostatisti…

深度剖析Gateway在微服务治理中的关键角色

目录 一、多层网关 二、Gateway 路由规则 2.1 路由 2.2 谓词 2.3 过滤器 三、路由声明规则 3.1 谓词 寻址谓词 请求参数谓词 时间谓词 自定义谓词 一、多层网关 首先我们先了解下一个请求是如何到达服务端并得到相应的。过程如图所示&#xff1a; 首先网址解析的第一步是 DN…

esp32S3 http通信

esp32 进行http通信非常简单,用到的库有urequests、network。urequests用于发送http请求并获取返回结果;network用于连接网络 network连接网络代码如下 import network def do_connect():"""链接WIFI"""wlan = network.WLAN(network.STA_IF)w…

http是什么?http的基础知识教程详解(2024-04-24)

1、http的概念 HTTP&#xff08;超文本传输协议&#xff0c;HyperText Transfer Protocol&#xff09;是一种用于分布式、协作式、超媒体信息系统的应用层协议。 HTTP 是万维网&#xff08;WWW&#xff09;的数据通信的基础&#xff0c;设计目的是确保客户端与服务器之间的通…

揭开六西格玛培训真实面貌,为何它仍是企业优选

近年来&#xff0c;网络上时常有声音称六西格玛培训已经过时&#xff0c;不再适应当今快速变化的商业环境。然而&#xff0c;这种观点并不全面&#xff0c;也未能深入理解六西格玛管理的核心价值和现代应用。事实上&#xff0c;六西格玛作为一种以数据为驱动、旨在减少缺陷和提…

CQ 社区版 2.11.1|新增主体授权、操作向导等

四月&#xff0c;正是踏青时节&#xff5e; 不知道大家有没有约上三五好友一起去踏青露营 但 CQ 与大家的一月一见&#xff0c;不会失约&#xff01; 让我们一起来看看本月的社区版有哪些更新吧&#xff5e; 「手动授权」模块划分为主体授权和客体授权 &#xff5c;新增用户维…

【动态规划】C++ 子序列问题(递增子序列、数对链、定差子序列、斐波那契子序列...)

文章目录 1. 前言2. 例题最长递增子序列 3. 算法题3.1_摆动序列3.2_最长递增子序列的个数3.3_最长数对链[3.4_ 最长定差子序列](https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/description/)3.5_最长的斐波那契子序列的长度3.6_最长等差数…

python-flask结合bootstrap实现网页小工具实例-半小时速通版

参考&#xff1a; Python之flask结合Bootstrap框架快速搭建Web应用_支持bootstrap的python软件-CSDN博客 https://blog.csdn.net/lovedingd/article/details/106696832 Bootstrap 警告框 | 菜鸟教程 https://www.runoob.com/bootstrap/bootstrap-alert-plugin.html flask框架…

用C#写一个读取pdf文档内容的库

安装这两个库&#xff0c;第二个库一定要安装否则有些pdf文件读取会出现异常 读取 using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Listener;namespace TestReadPdf {public static class PdfHelper{public static IE…

算法刷题day46

目录 引言一、树的重心二、毕业旅行问题三、高精度乘法 引言 今天复习了一下高精度的所有模板&#xff0c;包括加法、减法、乘法、除法&#xff0c;因为自己当时在蓝桥杯的时候没有看出来那个题使用高精度&#xff0c;因为对于一个数的大小和一个数的长度&#xff0c;自己有时…

关于卡尔曼滤波进行状态预测的方法

卡尔曼滤波是一种有效的线性动态系统状态估计方法。它通过递归地处理测量数据&#xff0c;结合系统动力学模型和测量模型&#xff0c;来预测和估计系统的状态。卡尔曼滤波特别适用于系统状态在时间上演化&#xff0c;而且测量数据存在噪声的情况。以下是卡尔曼滤波对于状态预测…

编译器的学习

常用的编译器&#xff1a; GCCVisual CClang&#xff08;LLVM&#xff09;&#xff1a; Clang 可以被看作是建立在 LLVM 之上的一个项目, 实际上LLVM是clang的后端&#xff0c;clang作为前端前端生成LLVM IR&#xff0c;https://zhuanlan.zhihu.com/p/656699711MSVC &#xff…