应用权限概述
系统提供了一种允许应用访问系统资源(如:通讯录等)和系统能力(如:访问摄像头、麦克风等)的通用权限访问方式,来保护系统数据(包括用户个人数据)或功能,避免它们被不当或恶意使用。
应用申请敏感权限时,必须填写权限使用理由字段,敏感权限通常是指与用户隐私密切相关的权限,包括地理位置、相机、麦克风、日历、健身运动、身体传感器、音乐、文件、图片视频等权限。参考向用户申请授权。
system_grant
 在配置文件中,声明应用需要请求的权限后,系统会在安装应用时自动为其进行权限预授予,开发者不需要做其他操作即可使用权限。
user_grant
- 在配置文件中,声明应用需要请求的权限,且要设置需要使用的场景+使用原因
 调用 requestPermissionsFromUser() 方法后,应用程序将等待用户授权的结果。如果用户授权,则可以继续访问目标操作。如果用户拒绝授权,则需要提示用户必须授权才能访问当前页面的功能,并引导用户到系统应用“设置”中打开相应的权限。可参考二次向用户申请权限 requestPermissionOnSetting() 。
申请权限
首先,在entry/src/main/module.json文件中配置需要申请的权限。
 
 在 abilities 同级添加 requestPermissions 字段,并在里面配置权限字段。
 
 权限描述字段在 main/resources/base/element/string.json 中配置

 可以直接填写,也可以点击Open editor进行 配置
 
 
 至此,基础配置已完成。
封装Permission工具
封装权限工具,提供请求用户权限,拉起用户权限设置的能力。
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit';
class Permission {
  // 请求用户授权
  async requestPermissions(permissions: Permissions[]) {
    const atManager = abilityAccessCtrl.createAtManager()
    const ctx = AppStorage.get<Context>('context')
    if (ctx) {
      const result = await atManager.requestPermissionsFromUser(ctx, permissions)
      return result.authResults.every(result => result === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    }
    return false
  }
  // 拉起二次弹窗半模态
  async openPermissionSetting(permissions: Permissions[]) {
    const atManager = abilityAccessCtrl.createAtManager()
    const ctx = AppStorage.get<Context>('context')
    if (ctx) {
      const authResults = await atManager.requestPermissionOnSetting(ctx, permissions)
      return authResults.every(result => result === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    }
    return false
  }
}
export const permission = new Permission()
之后在需要申请权限的页面进行权限判定。
async aboutToAppear() {
    // 1. 打开授权对话框
    // 2.1 授权,啥也不用干
    // 2.2 禁用,弹出一个对话框,提示用户授权,离开(返回上一个页面)去授权(去应用设置页面)
    try {
      //获取应用获取麦克风权限的结果
      const flag = await permission.requestPermissions(['ohos.permission.MICROPHONE'])
      //如果没有权限
      if (!flag) {
        //自定义弹窗,提醒用户
        const dialogResult = await promptAction.showDialog({
          title: '温馨提示',
          message: '未授权使用麦克风将无法使用该面试录音功能,是否前往设置进行授权?',
          buttons: [
            { text: '离开', color: $r('app.color.common_gray_01') },
            { text: '去授权', color: $r('app.color.black') }
          ],
        })
        //点击“离开”,返回上一个页面
        if (dialogResult.index === 0) {
          router.back()
        } else if (dialogResult.index === 1) {
          //点击授权,跳转至设置页
          const want: Want = {
            bundleName: 'com.huawei.hmos.settings',
            abilityName: 'com.huawei.hmos.settings.MainAbility',
            uri: 'application_info_entry',
            parameters: {
              // 修改成你的应用包名,跳转到该应用的设置页面
              pushParams: '修改成你的应用包名'
            }
          }
          const uiContext = getContext(this) as common.UIAbilityContext
          uiContext.startAbility(want)
        }
      }
    } catch (e) {
      router.back()
    }
  }
总结
如果是 HarmonyOS NEXT Developer Beta3(2024-09-12) 及以上版本,可以在本应用直接拉起二次授权的半模态弹窗,但如果是之前的版本,则需要跳转至设置页进行手动授权。
二次申请的半模态弹窗
 
 跳转至授权页的弹窗提醒
 














![LeetCode[简单] 141.环形链表](https://i-blog.csdnimg.cn/direct/c1a77a71073440f5b34b72e4ae55e500.png)




