在鸿蒙开发中,调用部分 API 时需要申请权限后,才能调用,如:网络请求,获取网络信息等。部分 API 调用的时候还会弹窗,如:麦克风(录音)、日历。接下来我们先简单的了解一下应用权限
一、应用权限的分类
日历、相机、麦克风、位置:权限级别 normal 所有应用都能用,但授权方式为 user_grant 需弹窗授权。
照片、通讯录:属于跨级权限,需要通过应用市场(AGC)申请签名证书,开发阶段用自动签名即可。
通知:其他权限。
二、配置声明权限
-
在 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()
})
}