鸿蒙NEXT开发权限工具类(申请授权相关)(ArkTs)
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import { bundleManager, common, PermissionRequestResult } from '@kit.AbilityKit';
import { BusinessError } from '@ohos.base';
import { ToastUtil } from './ToastUtil';/*** 权限工具类(申请授权相关)* author: CSDN-鸿蒙布道师* since: 2025/04/22*/
export class PermissionUtil {/*** 获取应用上下文*/private static getContext(): common.UIAbilityContext {return getContext() as common.UIAbilityContext;}/*** 创建权限管理器实例*/private static createAtManager(): abilityAccessCtrl.AtManager {return abilityAccessCtrl.createAtManager();}/*** 校验当前是否已经授权* @param permission 待判断的权限* @returns 已授权 true,未授权 false*/static async checkPermissions(permission: Permissions): Promise<boolean> {const grantStatus = await PermissionUtil.checkAccessToken(permission);return grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;}/*** 校验并申请权限* @param permissions 需要授权的权限* @returns true 表示授权成功,false 表示用户拒绝授权*/static async checkAndRequestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {const isGranted = await PermissionUtil.checkPermissions(permissions as Permissions);if (isGranted) {return true;}return PermissionUtil.requestPermissionsEasy(permissions);}/*** 申请权限(支持单个或多个权限组合)* @param permissions 需要授权的权限* @returns true 表示授权成功,false 表示用户拒绝授权*/static async requestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {const atManager = PermissionUtil.createAtManager();const context = PermissionUtil.getContext();const permissionArray = Array.isArray(permissions) ? [...permissions] : [permissions];try {const result = await atManager.requestPermissionsFromUser(context, permissionArray);return PermissionUtil.isPermissionGranted(result);} catch (error) {PermissionUtil.handleError(error, '申请权限失败');return false;}}/*** 申请权限并提供二次授权机会(推荐使用此方法)* @param permissions 需要授权的权限* @returns true 表示授权成功,false 表示用户拒绝授权*/static async requestPermissionsEasy(permissions: Permissions | Array<Permissions>): Promise<boolean> {const granted = await PermissionUtil.requestPermissions(permissions);if (granted) {return true;}return PermissionUtil.requestPermissionOnSettingEasy(Array.isArray(permissions) ? [...permissions] : [permissions]);}/*** 二次向用户申请权限(适用于单个权限或读写权限组)* @param permissions 需要授权的权限集合* @returns true 表示授权成功,false 表示用户拒绝授权*/static async requestPermissionOnSetting(permissions: Permissions | Array<Permissions>): Promise<boolean> {const atManager = PermissionUtil.createAtManager();const context = PermissionUtil.getContext();const permissionArray = Array.isArray(permissions) ? [...permissions] : [permissions];try {const result = await atManager.requestPermissionOnSetting(context, permissionArray);return PermissionUtil.isPermissionGranted(result);} catch (error) {PermissionUtil.handleError(error, '二次申请权限失败');return false;}}/*** 二次向用户申请权限(适用于多个权限)* @param permissions 需要授权的权限集合* @returns true 表示授权成功,false 表示用户拒绝授权*/static async requestPermissionOnSettingEasy(permissions: Array<Permissions>): Promise<boolean> {for (const permission of permissions) {const isGranted = await PermissionUtil.checkPermissions(permission);if (!isGranted) {const granted = await PermissionUtil.requestPermissionOnSetting(permission);if (!granted) {return false;}}}return true;}/*** 检查权限是否已授予* @param data 授权结果* @returns true 表示所有权限均已授予,false 表示存在未授予权限*/private static isPermissionGranted(data: PermissionRequestResult | Array<number>): boolean {const authResults = Array.isArray(data) ? data : data.authResults;return authResults.every((status) => status === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);}/*** 校验访问令牌是否已授权* @param permission 待检查权限* @returns 授权状态*/private static async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {const atManager = PermissionUtil.createAtManager();let tokenId = 0;try {const bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);tokenId = bundleInfo.appInfo.accessTokenId;} catch (error) {PermissionUtil.handleError(error, '获取应用信息失败');return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;}try {return await atManager.checkAccessToken(tokenId, permission);} catch (error) {PermissionUtil.handleError(error, '校验授权信息失败');return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;}}/*** 错误处理方法* @param error 错误对象(明确指定为 BusinessError 类型)* @param message 提示信息*/private static handleError(error: BusinessError, message: string): void {console.error(`${message}: ${error.message}`);ToastUtil.showToast(`${message}: ${error.message}`);}
}代码如下:
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import { bundleManager, common, PermissionRequestResult } from '@kit.AbilityKit';
import { BusinessError } from '@ohos.base';
import { ToastUtil } from './ToastUtil';/*** 权限工具类(申请授权相关)* author: CSDN-鸿蒙布道师* since: 2025/04/22*/
export class PermissionUtil {/*** 获取应用上下文*/private static getContext(): common.UIAbilityContext {return getContext() as common.UIAbilityContext;}/*** 创建权限管理器实例*/private static createAtManager(): abilityAccessCtrl.AtManager {return abilityAccessCtrl.createAtManager();}/*** 校验当前是否已经授权* @param permission 待判断的权限* @returns 已授权 true,未授权 false*/static async checkPermissions(permission: Permissions): Promise<boolean> {const grantStatus = await PermissionUtil.checkAccessToken(permission);return grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;}/*** 校验并申请权限* @param permissions 需要授权的权限* @returns true 表示授权成功,false 表示用户拒绝授权*/static async checkAndRequestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {const isGranted = await PermissionUtil.checkPermissions(permissions as Permissions);if (isGranted) {return true;}return PermissionUtil.requestPermissionsEasy(permissions);}/*** 申请权限(支持单个或多个权限组合)* @param permissions 需要授权的权限* @returns true 表示授权成功,false 表示用户拒绝授权*/static async requestPermissions(permissions: Permissions | Array<Permissions>): Promise<boolean> {const atManager = PermissionUtil.createAtManager();const context = PermissionUtil.getContext();const permissionArray = Array.isArray(permissions) ? [...permissions] : [permissions];try {const result = await atManager.requestPermissionsFromUser(context, permissionArray);return PermissionUtil.isPermissionGranted(result);} catch (error) {PermissionUtil.handleError(error, '申请权限失败');return false;}}/*** 申请权限并提供二次授权机会(推荐使用此方法)* @param permissions 需要授权的权限* @returns true 表示授权成功,false 表示用户拒绝授权*/static async requestPermissionsEasy(permissions: Permissions | Array<Permissions>): Promise<boolean> {const granted = await PermissionUtil.requestPermissions(permissions);if (granted) {return true;}return PermissionUtil.requestPermissionOnSettingEasy(Array.isArray(permissions) ? [...permissions] : [permissions]);}/*** 二次向用户申请权限(适用于单个权限或读写权限组)* @param permissions 需要授权的权限集合* @returns true 表示授权成功,false 表示用户拒绝授权*/static async requestPermissionOnSetting(permissions: Permissions | Array<Permissions>): Promise<boolean> {const atManager = PermissionUtil.createAtManager();const context = PermissionUtil.getContext();const permissionArray = Array.isArray(permissions) ? [...permissions] : [permissions];try {const result = await atManager.requestPermissionOnSetting(context, permissionArray);return PermissionUtil.isPermissionGranted(result);} catch (error) {PermissionUtil.handleError(error, '二次申请权限失败');return false;}}/*** 二次向用户申请权限(适用于多个权限)* @param permissions 需要授权的权限集合* @returns true 表示授权成功,false 表示用户拒绝授权*/static async requestPermissionOnSettingEasy(permissions: Array<Permissions>): Promise<boolean> {for (const permission of permissions) {const isGranted = await PermissionUtil.checkPermissions(permission);if (!isGranted) {const granted = await PermissionUtil.requestPermissionOnSetting(permission);if (!granted) {return false;}}}return true;}/*** 检查权限是否已授予* @param data 授权结果* @returns true 表示所有权限均已授予,false 表示存在未授予权限*/private static isPermissionGranted(data: PermissionRequestResult | Array<number>): boolean {const authResults = Array.isArray(data) ? data : data.authResults;return authResults.every((status) => status === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);}/*** 校验访问令牌是否已授权* @param permission 待检查权限* @returns 授权状态*/private static async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {const atManager = PermissionUtil.createAtManager();let tokenId = 0;try {const bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);tokenId = bundleInfo.appInfo.accessTokenId;} catch (error) {PermissionUtil.handleError(error, '获取应用信息失败');return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;}try {return await atManager.checkAccessToken(tokenId, permission);} catch (error) {PermissionUtil.handleError(error, '校验授权信息失败');return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;}}/*** 错误处理方法* @param error 错误对象(明确指定为 BusinessError 类型)* @param message 提示信息*/private static handleError(error: BusinessError, message: string): void {console.error(`${message}: ${error.message}`);ToastUtil.showToast(`${message}: ${error.message}`);}
}
相关文章:
鸿蒙NEXT开发权限工具类(申请授权相关)(ArkTs)
import abilityAccessCtrl, { Permissions } from ohos.abilityAccessCtrl; import { bundleManager, common, PermissionRequestResult } from kit.AbilityKit; import { BusinessError } from ohos.base; import { ToastUtil } from ./ToastUtil;/*** 权限工具类(…...
自动驾驶与机器人算法学习
自动驾驶与机器人算法学习 直播与学习途径 欢迎你的点赞关注~...
【网络编程】TCP数据流套接字编程
目录 一. TCP API 二. TCP回显服务器-客户端 1. 服务器 2. 客户端 3. 服务端-客户端工作流程 4. 服务器优化 TCP数据流套接字编程是一种基于有连接协议的网络通信方式 一. TCP API 在TCP编程中,主要使用两个核心类ServerSocket 和 Socket ServerSocket Ser…...
从零开始配置 Zabbix 数据库监控:MySQL 实战指南
Zabbix作为一款开源的分布式监控工具,在监控MySQL数据库方面具有显著优势,能够为数据库的稳定运行、性能优化和故障排查提供全面支持。以下是使用Zabbix监控MySQL数据库的配置。 一、安装 Zabbix Agent 和 MySQL 1. 安装 Zabbix Agent services:zabbix…...
Java学习手册:RESTful API 设计原则
一、RESTful API 概述 REST(Representational State Transfer)即表述性状态转移,是一种软件架构风格,用于设计网络应用程序。RESTful API 是符合 REST 原则的 Web API,通过使用 HTTP 协议和标准方法(GET、…...
读一篇AI论文并理解——通过幻觉诱导优化缓解大型视觉语言模型中的幻觉
目录 论文介绍 标题 作者 Publish Date Time PDF文章下载地址 文章理解分析 📄 中文摘要:《通过幻觉诱导优化缓解大型视觉语言模型中的幻觉》 🧠 论文核心动机 🚀 创新方法:HIO(Hallucination-In…...
Linux与Anaconda环境部署与管理(运维交接)
文章目录 一、前言二、Linux基础命令三、进程管理与监控四、后台任务与服务管理五、Anaconda环境管理六、JAR包的运行与管理七、网络与端口映射八、安全与权限管理九、故障排查与日志分析十、附录 一、前言 本文将详细介绍Linux系统下的常用命令以及Anaconda环境管理ÿ…...
IOT项目——物联网 GPS
GeoLinker - 物联网 GPS 可视化工具 项目来源制作引导 项目来源 [视频链接] https://youtu.be/vi_cIuxDpcA?sigMaOKv681bAirQF8 想要在任何地方追踪任何东西吗?在本视频中,我们将向您展示如何使用 ESP32 和 Neo-6M GPS 模块构建 GPS 跟踪器——这是一…...
Java学习手册:HTTP 协议基础知识
一、HTTP 协议概述 HTTP(HyperText Transfer Protocol)即超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传输协议。它是一个应用层协议,基于请求-响应模型…...
【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现
课程目标: 教你从零开始部署运行项目,学习环境搭建、项目导入及部署,含项目源码、文档、数据库、软件等资料 课程简介: 本课程演示的是一款基于微信小程序的健康饮食食谱推荐平台的设计与实现,主要针对计算机相关专…...
Redis 慢查询分析与优化
Redis 慢查询分析与优化 参考书籍 : https://weread.qq.com/web/reader/d5432be0813ab98b6g0133f5kd8232f00235d82c8d161fb2 以下从配置参数、耗时细分、分析工具、优化策略四个维度深入解析 Redis 慢查询问题,结合实战调优建议,帮助开发者…...
使用达梦官方管理工具SQLark快速生成数据库ER图并导出
在数据库设计与开发中,实体-关系图(ER 图)作为数据建模的核心工具,能够直观呈现表结构、字段属性及表间关系,是团队沟通和文档维护的重要工具。然而,许多开发者在实际工作中常面临一个痛点:手动…...
鸿蒙NEXT开发定位工具类 (WGS-84坐标系)(ArkTs)
import geoLocationManager from ohos.geoLocationManager; import { BusinessError, Callback } from ohos.base; import { LogUtil } from ./LogUtil; import { PermissionUtil } from ./PermissionUtil; import { map, mapCommon } from kit.MapKit; /*** 定位工具类 (WGS-8…...
模型 替罪羊效应
系列文章分享模型,了解更多👉 模型_思维模型目录。转嫁罪责于无辜,维系群体控制与稳定 1 替罪羊效应的应用 1.1 多品牌危机中的行业“背锅侠” 行业背景:食品行业爆发大规模安全危机,多家企业卷入某类食品重金属超标…...
TapData × 梦加速计划 | 与 AI 共舞,TapData 携 AI Ready 实时数据平台亮相加速营,企业数据基础设施现代化
在实时跃动的数据节拍中,TapData 与 AI 共舞,踏出智能未来的新一步。 4月10日,由前海产业发展集团、深圳市前海梦工场、斑马星球科创加速平台等联合发起的「梦加速计划下一位独角兽营」正式启航。 本次加速营以“打造下一位独角兽企业”为目…...
15.电感特性在EMC设计中的运用
电感特性在EMC设计中的运用 1. 共模电感与差模电感的差异2. 电感的高频等效特性3. 电感在EMC设计中的使用注意事项3.1 LC滤波计算3.2 并联型多级浪涌防护的电感退耦 1. 共模电感…...
uniapp Vue2升级到Vue3,并发布到微信小程序的快捷方法
目录 前言:升级项目的两种方式步骤一、新建项目 【选择-默认模版】二、修改-pages.json三、补充-缺少的文件四、修改-Main.js按照 [官方文档-vue2升级vue3迁移指南](https://uniapp.dcloud.net.cn/tutorial/migration-to-vue3.html) 修改 五、升级-uni-ui扩展组件的…...
数据重构如何兼顾效率与性能稳定?zStorage 全闪存分布式存储的技术实践与实测数据
点击蓝字 关注我们 zStorage 作为数据库场景下的全闪存分布式存储,除了性能要好,更重要的是要在各种情况下都能保持“稳定”的好。一个高并发的交易型业务数据库,如果出现轻微的IO抖动,就可能造成数据库并发事务提交的排队&#x…...
linux下内存地址数学运算
如下代码计算地址并16字节对齐: char* buffer (char*)malloc(a3 0x1000);unsigned long long tmp (((unsigned long long)buffer 0x10) & 0xffffffffffffff00);char* buf (char*)tmp;假如把地址当作整数,加减程序运算,直接转换是不行…...
A2A + MCP:构建实用人工智能系统的超强组合
构建真正有效的连接型人工智能系统的挑战 如果你正在构建人工智能应用,这种情况可能听起来很熟悉: 你需要特定的人工智能能力来解决业务问题。你找到了完成每个单独任务的出色工具。但把所有东西连接在一起却占据了大部分开发时间,还创建了…...
力扣每日打卡17 49. 字母异位词分组 (中等)
力扣 49. 字母异位词分组 中等 前言一、题目内容二、解题方法1. 哈希函数2.官方题解2.1 前言2.2 方法一:排序2.2 方法二:计数 前言 这是刷算法题的第十七天,用到的语言是JS 题目:力扣 49. 字母异位词分组 (中等) 一、题目内容 给…...
Word处理控件Spire.Doc系列教程:C# 为 Word 文档设置背景颜色或背景图片
在 Word 文档中,白色是默认的背景设置。一般情况下,简洁的白色背景足以满足绝大多数场景的使用需求。但是,如果您需要创建简历、宣传册或其他创意文档,设置独特的背景颜色或图片能够极大地增强文档的视觉冲击力。本文将演示如何使…...
ecovadis评级范围,如何拿到ecovadis评级高分
EcoVadis评级范围及高分策略详解 一、EcoVadis评级范围(四大核心主题) EcoVadis从以下4大维度对企业进行评分,权重因行业而异(如制造业更侧重环境,IT业更关注商业道德): 评估维度具体评估内容…...
掌握 Altium Designer:轻松定制“交换器件”工具栏
在PCB设计过程中,快速交换器件(如电阻、电容、IC等)是提高效率的关键。Altium Designer提供了灵活的工具栏定制功能,让用户可以创建专属的"交换器件"工具栏,将常用操作集中管理,减少菜单切换时间…...
JavaScript的JSON处理Map的弊端
直接使用 Map 会遇到的问题及解决方案 直接使用 Map 会导致数据丢失,因为 JSON.stringify 无法序列化 Map。以下是详细分析及解决方法: 问题复现 // 示例代码 const myMap new Map(); myMap.set(user1, { name: Alice }); myMap.set(user2, { name: B…...
【C++ Qt】信号和槽(内配思维导图 图文并茂 通俗易懂)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是Qt中的第三章,也是我们理解Qt中必备的点 信号槽,它本质由信号和槽两个来实现,其中将细致的讲述如何自定义信号…...
突破AI检测边界:对抗技术与学术伦理的终极博弈
随着GPT-4、Claude等大模型的文本生成能力突破人类写作水平,AI检测工具与对抗技术的博弈已进入白热化阶段。本文深入解析基于对抗训练的文本风格混淆网络如何突破GPTZero最新防御体系,探讨OpenAI多模态内容溯源系统引发的技术升级,并针对学术…...
从零开始构建微博爬虫:实现自动获取并保存微博内容
从零开始构建微博爬虫:实现自动获取并保存微博内容 前言 在信息爆炸的时代,社交媒体平台已经成为信息传播的重要渠道,其中微博作为中国最大的社交媒体平台之一,包含了大量有价值的信息和数据。对于研究人员、数据分析师或者只是…...
Git -> Git 所有提交阶段的回滚操作
已经修改但没有暂存的回滚 修改状态单个文件所有文件说明已修改未暂存git checkout -- 文件路径git checkout -- .丢弃工作区修改 已经暂存但没有提交的回滚 修改状态单个文件所有文件说明已暂存未提交git reset HEAD 文件路径 -> git checkout -- 文件路径git reset HEA…...
三餐四季、灯火阑珊
2025年4月22日,15~28℃,挺好的 待办: 教学技能大赛教案(2025年4月24日,校赛,小组合作,其他成员给力,暂不影响校赛进度,搁置) 教学技能大赛PPT(202…...
