应用场景
在鸿蒙开发中,当我们调用一些需要申请系统权限的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%')
}
}