应用权限管理

在鸿蒙开发中,调用部分 API 时需要申请权限后,才能调用,如:网络请求,获取网络信息等。部分 API 调用的时候还会弹窗,如:麦克风(录音)、日历。接下来我们先简单的了解一下应用权限

一、应用权限的分类

日历、相机、麦克风、位置:权限级别 normal 所有应用都能用,但授权方式为 user_grant 需弹窗授权。

照片、通讯录:属于跨级权限,需要通过应用市场(AGC)申请签名证书,开发阶段用自动签名即可。

通知:其他权限。

二、配置声明权限

  1. 在 module.json5 中添加权限

      {
        "name": "ohos.permission.GET_NETWORK_INFO"
      },

      2.  当权限为 user_grant 时,要添加申请权限原因

      {
        "name": "ohos.permission.CAMERA",
        "reason": '$string:permission_reason_camera',
        "usedScene": {}
      },

三、应用权限管理的简单封装

import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';

class PermissionManager {

  // 检查是否授权
  checkPermissions(permissions: Permissions[]) {
    // 程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager();
    // 获取 bundle 信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 提取 tokenID 标识
    const tokenID = bundleInfo.appInfo.accessTokenId
    // 校验应用是否被授予权限
    const authResults = permissions.map((item) => atManager.checkAccessTokenSync(tokenID, item))
    // 返回是否已授权结果
    return authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  }

  // 动态申请授权(首次弹窗申请)
  async requestPermissions(permissions: Permissions[]) {
    // 程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager();
    // 拉起弹框请求用户授权
    const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions)
    // 获取请求权限的结果
    const isAuth = grantStatus.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    // 返回 Promise 授权结果
    return isAuth ? Promise.resolve(true) : Promise.reject(false)
  }

  // 打开系统设置的权限管理页(处理授权结果)
  openPermissionSettingsPage() {
    // 获取上下文
    const context = getContext() as common.UIAbilityContext
    // 获取包信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 打开系统设置页
    context.startAbility({
      bundleName: 'com.huawei.hmos.settings',
      abilityName: 'com.huawei.hmos.settings.MainAbility',
      uri: 'application_info_entry',
      parameters: {
        // 按照包名打开对应设置页
        pushParams: bundleInfo.name
      }
    })
  }
}

export const permissionManager = new PermissionManager()

四、应用权限封装之后的使用

以下代码仅供参考

@State isNotificationEnabled: boolean = false


async updatePermissionState() {
    // 是否开启通知权限
    this.isNotificationEnabled = await notificationManager.isNotificationEnabled()
}

//  ...省略
             if (this.isNotificationEnabled) {
                Text('已开启')
                  .fontSize(14)
                  .fontColor($r('app.color.brand'))
              } else {
                Toggle({ type: ToggleType.Switch, isOn: this.isNotificationEnabled })
                  .onChange(async () => {
                    // 点击申请 notification 权限
                    try {
                      // 授权弹窗
                      await notificationManager.requestEnableNotification()
                    } catch (error) {
                      // 打开设置页
                      promptAction.showDialog({
                        title: "温馨提示",
                        message: "建议开启通知权限,以提供更好的体验",
                        buttons: [
                          { text: '取消', color: $r('app.color.font_sub') },
                          { text: '去授权', color: $r('app.color.brand') }
                        ]
                      })
                        .then((res)=>{
                          if(res.index === 1){
                            permissionManager.openPermissionSettingsPage()
                          }
                        })
                    }
                    // 更新所有权限授权状态
                    this.updatePermissionState()
                  })
              }
  • 19
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值