鸿蒙中封装一个通用的权限工具-弹窗请求授权和二次授权

news/2025/3/22 14:37:44/文章来源:https://www.cnblogs.com/cbnh/p/18786551


应用场景

在鸿蒙开发中,当我们调用一些需要申请系统权限的API时,我们需要申请用户授权。

当然也会遇到用户点击不允许的情况,这时候我们要提示用户,是否进行二次授权,否则将不能使用该功能,如果用户依然不授权,则返回上一页或等下次调用权限依旧申请二次授权。

点击去授权,则拉起二次授权窗口。

申请权限的流程
如果用户要使用一些权限,首先我们要看官方文档确定权限的等级。

并且需要在module.json5进行配置

"module": {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.MICROPHONE",
"usedScene": {},
"reason": "$string:MICROPHONE_use_reason"
}
],
}

权限等级分为

system_grant : 统会在安装应用时自动为其进行权限预授予
user_grant:
在配置文件中,声明应用需要请求的权限,使用的场景,使用原因
调用requestPermissionsFromUser() 方法请求用户授权
如果用户授权,则可以继续访问目标操作。如果用户拒绝授权,则需要提示用户必须授权才能访问当前页面的功能,并引导用户到系统应用“设置”中打开相应的权限。可参考二次向用户申请权限 requestPermissionOnSetting() 。
封装通用permission工具
        用户如果在每个使用权限的地方,都进行一次又一次的判断,那么光判断权限的代码就会非常冗余,而且重复。那么不如封装一个通用的鉴权函数,在每次使用权限的地方,传入需要的权限数组,返回申请结果 true 或 false。根据返回值 判断是否需要二次判断,或自行制作自己需要的逻辑。

这里需要提前将上下文存入AppStorage中

建议在EntryAbility.ets中的onWindowStageCreate函数中

AppStorage.setOrCreate('context', this.context)
import { abilityAccessCtrl, Permissions } from "@kit.AbilityKit";

class Permission {
/**

  • 拉起用户授权
    */
    async requestPermissions(permissions: Permissions[]) {
    // 1. 创建一个权限管理对象
    const atManager = abilityAccessCtrl.createAtManager()
    const ctx = AppStorage.get('context')
    if (ctx) {
    // 2. 向用户申请麦克风授权
    const res = await atManager.requestPermissionsFromUser(ctx, permissions)
    // -1 PERMISSION_DENIED 表示未授权 0 PERMISSION_GRANTED 已授权
    const flag = res.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    return flag
    }
    return false
    }

/**

  • 二次授权
    */
    async openPermissionSetting(permissions: Permissions[]) {
    // 1. 创建一个权限管理对象
    const atManager = abilityAccessCtrl.createAtManager()
    const ctx = AppStorage.get('context')
    if (ctx) {
    // 2. 拉起二次授权
    const res = await atManager.requestPermissionOnSetting(ctx, permissions)
    // 3. 获取二次授权的结果
    const flag = res.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    return flag
    }
    return false
    }
    }

export const permission = new Permission()

工具使用示例
这个使用示例是模拟申请麦克风授权的的场景。

在录音的页面,一进页面就要判断是否具有麦克风权限,没有则首次弹窗申请权限
如果授权则不再判断,如果不授权提示用户不授权无法使用。
如果用户依旧不授权,则返回上一页。
如果用户点击去授权,则拉起二次授权弹窗
二次授权不授权依旧返回上一页。
再次进入页面直接弹起提示用户去授权。
import { permission } from './Permission'
import { Permissions } from '@kit.AbilityKit'
import { promptAction, router } from '@kit.ArkUI'

@Entry
@Component
struct Test {
// 1. 权限列表
permissions: Permissions[] = ['ohos.permission.MICROPHONE']
confirmConfig: promptAction.ShowDialogOptions = {
title: "温馨提示",
message: "未授权使用麦克风将无法使用该面试录音功能,是否前往设置进行授权?",
buttons: [
{ text: '离开', color: '#ff676767' },
{ text: '去授权', color: '#000' }
]
}

async aboutToAppear() {
await this.getPermission()
}

/**

  • 获取麦克风权限
    */
    async getPermission() {
    try {
    // 1. 第一次拉起授权
    const isOk1 = await permission.requestPermissions(this.permissions)
    if (isOk1) {
    return
    }
    // 2. 弹窗再次确认
    const res = await promptAction.showDialog(this.confirmConfig)
    if (res.index === 1) {
    const isOk2 = await permission.openPermissionSetting(this.permissions)
    if (isOk2) {
    return
    }
    }
    router.back()
    } catch (e) {
    promptAction.showToast({ message: '用户授权出现问题' })
    router.back()
    }
    }

build() {
Column() {
Button('测试')
}
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FristiLeaks_1

FristiLeaks_1.3 环境搭建 下载:https://download.vulnhub.com/fristileaks/FristiLeaks_1.3.ova 导入后将mac地址修改为:08:00:27:A5:A6:76信息收集 扫描主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 1…

绿联nas防火墙导致docker网络无法互通

问题描述设备:绿联nas dxp4800 系统:ugnas pro 绿联新系统在12月份更新后,原本用nginx代理的alist,青龙等服务全都连接不上,在ugnas系统防火墙设置如下:对外只通过80端口,其他docker服务都只能通过nginx反代访问,系统更新前一直都没问题。 问题排查 经过反复排查发现关…

20244119 实验一 《Python程序设计》 实验报告

课程:《Python程序设计》 班级: 2441 姓名: 霍彬斌 学号:20244109 实验教师:王志强 必修/选修: 公选课 一、实验内容 熟悉Pycharm等开发环境; 掌握基本的Python运行和调试技能; 掌握基本的Python编程技能。 二、实验过程及结果 1.熟悉Python开发环境; 本次实验使用pyc…

一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1

环境准备 硬件环境 CPU:intel四代至强及以上,AMD参考同时期产品 内存:800GB以上,内存性能越强越好,建议DDR5起步 显卡:Nvidia显卡,单卡显存至少24GB(用T4-16GB显卡实测会在加载模型过程中爆显存),nvidia compute capability至少8.0(CUDA GPUs - Compute Capability …

20244119实验一《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2441 姓名: 霍彬斌 学号:20244109 实验教师:王志强 必修/选修: 公选课 一、实验内容 熟悉Pycharm等开发环境; 掌握基本的Python运行和调试技能; 掌握基本的Python编程技能。 二、实验过程及结果 1.熟悉Python开发环境; 本次实验使用pyc…

WebSocket系列 注册 @ServerEndpoint类失败

WebSocket系列—注册 @ServerEndpoint类失败 目录WebSocket系列—注册 @ServerEndpoint类失败一、问题背景二、寻找问题三、解决问题3.1、自己定义的切面3.2、外部框架的切面四、参考博客五、WebSocket系列地址 一、问题背景 博主最近分到后端主动推送报警业务,调研了一圈(轮…

实验1 C语言输入输出和简单程序编写补充

任务二:判断它能否构成三角形 #include <stdio.h> int main(){ double a, b, c; scanf_s("%lf%lf%lf", &a, &b, &c); if ((a + b > c) && (a + c > b) && (b + c > a)) printf("能构成三角…

ASE15N45-ASEMI智能家居专用ASE15N45

ASE15N45-ASEMI智能家居专用ASE15N45编辑:ll ASE15N45-ASEMI智能家居专用ASE15N45 型号:ASE15N45 品牌:ASEMI 封装:TO-220 批号:最新 最大漏源电流:15A 漏源击穿电压:450V RDS(ON)Max:0.38Ω 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道M…

什么是RabbitMQ入门

一.什么是RabbitMQ 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件=平台+…

使用BL0937 IC进行交流电源监控

一个简单的电路来监测交流电源,接线板可以插在任何地方,显示电压,电流和功率。交流电源监控是当今物联网相关应用中的一个惊人功能,例如智能风扇,开关和板。一些优秀的公司董事会在他们的产品中实施了这项技术,并持续监控供应的输出功率。在本地设备层面监控电源有其自身…

20244224 实验一《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名: 旦曾央京 学号:20244224 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等; 4.编…

【智慧构造题】CF1427E Xum

我们发现这个原数为奇数的条件比较神秘,于是我们考虑每次把这个数字第一位 \(1\) 给干了。 考虑怎么构造。 令 $d=\lfloor \log_2 x \rfloor $ 令 \(x=1abc1\) \(x1=1abc10000\) \(x2=1abc0abc1\) \(x3=x2+x1=1abc01abc1\) \(x4=x ⊕ x3=1abc000000\) \(x5=x1+x1=1abc100000…