应用权限管理

445 阅读3分钟

1 应用权限概述

鸿蒙开发中,调用部分API时使用申请权限后 才能能调用

申请应用权限时 需要注意两个关键点

1 权限级别

官方应用权限文档 image.png

2 授权方式

system_grant(系统授权) 自动授权:

system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。

如果在应用中申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用

user_grant(用户授权) 会有弹窗 需要签名证书:

user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响

该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

2 申请system_grant 用户权限

配置声明权限

1 需要配置声明 在module.json5中

// 权限级别: normal
// 授权方式: user_grant
{
  "name": "ohos.permission.READ_CALENDAR", // 只读日历
  "reason": '$string:permission_reason_calendar',
  "usedScene": {}
},
{
  "name": "ohos.permission.WRITE_CALENDAR", // 写入日历
  "reason": '$string:permission_reason_calendar',
  "usedScene": {}
},

2 配置声明注意还需要添加授权原因 如:用于做某事....

image.png

检查是否已经授权

1 程序访问控制管理 核心APIcreateAtManager

2 校验应用是否被授予权限 核心API checkAccessTokenSync

// 1 程序访问控制管理
const atManager = abilityAccessCtrl.createAtManager()
// 2 获取 bundle 包的信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 3 提取 tokenID 标识
const tokenID = bundleInfo.appInfo.accessTokenId
// 4 核心代码 校验应用是否被授予权限 -1:没有权限 0:获取到权限
const grantStatus = atManager.checkAccessTokenSync(tokenID,"ohos.permission.READ_CALENDAR")

向用户申请授权 只有首次申请才会弹窗

1 程序访问控制管理

2 弹窗请求用户授权 核心API requestPermissionsFromUser 两个必填参数 1 获取上下文 2 需要校验的权限名称

image.png

// 1 程序访问控制管理
const atManager = abilityAccessCtrl.createAtManager()
// 2 拉起弹窗请求用户授权 -> 应用首次申请时才会弹窗
const grantStatus =await atManager.requestPermissionsFromUser(getContext(),填写需要校验的权限名称)

授权结果

如果用户在弹窗中拒绝了授权 鸿蒙没有内置的开启授权 需要引导用户去设置页面开启

1 获取上下文 通过as 断言 common.UIAbilityContext 后续使用

2 获取到包信息

3 打开设置页面(常规写法 直接 CV)

// 1 获取到上下文
// 并通过 as 断言为 UIAbilityContext,UIAbilityContext 才能调用 startAbility 这个 API
const context = getContext() as common.UIAbilityContext
// 2 获取 bundle 包信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 3 打开系统设置页
context.startAbility({
  // 打开设置页的固定写法
  bundleName: 'com.huawei.hmos.settings',
  abilityName: 'com.huawei.hmos.settings.MainAbility',
  uri: 'application_info_entry',
  parameters:{
    // 按照包名 :打开对应的应用页的详情页面
    pushParams:bundleInfo.name
  }

以上就是我个人见解 本人小白一名 如有错的地方 敬请谅解 欢迎大家补充 感谢