鸿蒙开发封装权限管理 检测是否授权 动态申请授权的 打开系统设置
温馨提示:本文最后更新于2024年10月17日 20:29,若内容或图片失效,请在下方留言或联系博主。
检测是否授权 动态申请授权的 打开系统设置
// 封装一个 检测是否授权 动态申请授权的 打开系统设置的权限管理页(处理授权结果)
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';
class PermissionManager {
// 检查是否授权
checkPermissions(permissions: Permissions[]) {
// 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. 核心 API (因为想一次传递多个 所哟使用一个数组 map 挨个进项权限检测)
const grantStatus = permissions.map((item) => {
return atManager.checkAccessTokenSync(tokenID, item)
})
// 5. 返回授权状态
// every (条件) 遍历时所有条件都成立 返回 true 有一个不成立就返回 false
// i => i == 0 也可以 只不过不标准,使用 abilityAccessCtrl 中有一个枚举值(更加正规)
return grantStatus.every(i => i == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
}
// 动态申请授权(首次弹窗申请)
async requestPermissions(permissions: Permissions[]) {
// 1. 程序访问控制管理
const atManager = abilityAccessCtrl.createAtManager()
// 2. 动态向用户申请授权 ---获取上下文 数组格式的授权列表
const requestResult = await atManager.requestPermissionsFromUser(getContext(), permissions)
// 3. 判断是否成功---(abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED == 0 )
const isAuth = requestResult.authResults.every(i => i == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
// 4. 返回 授权状态
// Promise.resolve(true) 标识成功, await 后面的代码可以继续执行
// Promise.reject(false) 标识失败, await 后面的代码不会继续执行(并可以通过过 try()catch() 捕获到 reject的错误 信息)
return isAuth == true ? Promise.resolve(true) : Promise.reject(false)
}
// 打开系统设置的权限管理页(处理授权结果)
openPermissionSettingsPage() {
// 获取上下文
const context = getContext() as common.UIAbilityContext
// 获取包信息 (动态获取 AppScope/app.json5 中的配置包信息) -- "bundleName": "com.itheima.hm_guardian",
const bundleInfo =
bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 打开系统设置页
context.startAbility({
bundleName: 'com.huawei.hmos.settings', // 固定写法CV:设置页的包名
abilityName: 'com.huawei.hmos.settings.MainAbility', // 固定写法CV:设置页的 ability 名
uri: 'application_info_entry', // 固定写法CV:打开 设置->应用和元服务
parameters: {
// 按照包名打开对应设置页(对应的详情页面) -- "bundleName": "com.itheima.hm_guardian",
pushParams: bundleInfo.name
}
})
}
}
// 导出 Manager
export const permissionManager = new PermissionManager()