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

87 阅读3分钟

 应用场景

​编辑

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

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

​编辑

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

​编辑

申请权限的流程

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

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

"module": {

"requestPermissions": [

{

"name": "ohos.permission.INTERNET"

},

{

"name": "ohos.permission.MICROPHONE",

"usedScene": {},

"reason": "$string:MICROPHONE_use_reason"

}

],

}

权限等级分为

  1. system_grant : 统会在安装应用时自动为其进行权限预授予
  2. user_grant:
  3. 在配置文件中,声明应用需要请求的权限,使用的场景,使用原因
  4. 调用requestPermissionsFromUser() 方法请求用户授权
  5. 如果用户授权,则可以继续访问目标操作。如果用户拒绝授权,则需要提示用户必须授权才能访问当前页面的功能,并引导用户到系统应用“设置”中打开相应的权限。可参考二次向用户申请权限 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()

工具使用示例

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

  1. 在录音的页面,一进页面就要判断是否具有麦克风权限,没有则首次弹窗申请权限
  2. 如果授权则不再判断,如果不授权提示用户不授权无法使用。
  3. 如果用户依旧不授权,则返回上一页。
  4. 如果用户点击去授权,则拉起二次授权弹窗
  5. 二次授权不授权依旧返回上一页。
  6. 再次进入页面直接弹起提示用户去授权。

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%')

}

}