1.配置声明权限
在 module.json5 中添加权限说明
2.添加reason权限使用理由
a. 当申请的权限为 user_grant 权限时必填,并且需要进行多语种适配。 b. 参考句式:用于某事,如:(麦克风)用于录制加密视频和音频。
3.判断是否有权限
Button('检测权限')
.onClick(() => {
/*
* 判断是否有权限
* */
//bundleInfo应用程序包的信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
//tokenID应用的唯一标识
const tokenID = bundleInfo.appInfo.accessTokenId
//程序控制访问程序
const atManager = abilityAccessCtrl.createAtManager()
//检测应用是否获得权限
const authResults = atManager.checkAccessTokenSync(tokenID, 'ohos.permission.READ_CALENDAR')
AlertDialog.show({ message: JSON.stringify(authResults, null, 2) })
// router.pushUrl({ url: '/' })
})
4.动态申请权限
Button('动态申请权限')
.onClick(async () => {
/*
* 动态申请权限
* */
//1.程序访问控制管理
const atManager = abilityAccessCtrl.createAtManager()
//2.动态的申请权限,并返回授权结果,读写共用一个弹窗(属于同一个权限组才可以共用一个弹窗)
const result = await atManager.requestPermissionsFromUser(getContext(), ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'])
AlertDialog.show({ message: JSON.stringify(result, null, 2) })
})
5.处理授权结果
Button('处理授权结果')
.onClick(() => {
/*
* 处理授权结果
* */
//如果不指定类型只能使用一些通用的类型
// 1.获取上下文
const context = getContext() as common.UIAbilityContext
// 2.获取包信息
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
}
})
})
6.申请user_grant权限的封装类
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';
/*如何申请权限*/
class PermissionManager {
/*检查是否授权*/
checkPermissions(permissions: Permissions[]) {
//1.获取bundleInfo应用程序包的信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
//2.获取tokenID应用的唯一标识
const tokenID = bundleInfo.appInfo.accessTokenId
//3.获取程序控制访问程序
const atManager = abilityAccessCtrl.createAtManager()
//4.检测应用是否获得权限(核心API)
const grantStates = permissions.map(item => {
return atManager.checkAccessTokenSync(tokenID, item)
})
//5.返回权限状态,检测里面是不是都满足权限,有一个不满足就为false
return grantStates.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
}
/*动态申请授权(首次弹窗申请)*/
async requestPermissions(permissions: Permissions[]) {
//1.程序访问控制管理
const atManager = abilityAccessCtrl.createAtManager()
//2.动态的申请权限,并返回授权结果,读写共用一个弹窗(属于同一个权限组才可以共用一个弹窗)
const result = await atManager.requestPermissionsFromUser(getContext(), permissions)
//3.检查权限的结果,每一项都通过就返回true
const isAuth = result.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
// 返回 Promise 授权结果
/*
* Promise.resolve(true) 成功 程序继续执行
* Promise.reject(false) 失败 后续代码不再执行
* */
return isAuth ? Promise.resolve(true) : Promise.reject(false)
}
/*处理授权结果,打开设置页*/
openPermissionSettingPage() {
//如果不指定类型只能使用一些通用的类型
// 1.获取上下文
const context = getContext() as common.UIAbilityContext
// 2.获取包信息,动态获取AppScope/app.json5的包信息
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
}
})
}
}
export const permissionManager = new PermissionManager()
/*
* checkPermissions的使用示例
* */
/*
Button('检测权限-封装')
.onClick(() => {
const res = permissionManager.checkPermissions(['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'])
AlertDialog.show({ message: JSON.stringify(res, null, 2) })
})*/
/*requestPermissions的使用示例*/
/*
Button('动态申请权限-封装')
.onClick(async () => {
//如果用户拒绝后后续操作将会发生改变或不执行
try {
const res = await permissionManager.requestPermissions(['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'])
AlertDialog.show({ message: JSON.stringify(res, null, 2) })
} catch (err) {
promptAction.showToast({ message: JSON.stringify(err) })
}
})
*/
/*openPermissionSettingPage的使用示例*/
/*
Button('处理授权结果-封装')
.onClick(() => {
permissionManager.openPermissionSettingPage()
})
示例2
Button('动态申请权限-封装')
.onClick(async () => {
//如果用户拒绝后后续操作将会发生改变或不执行
try {
const res = await permissionManager.requestPermissions(['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'])
AlertDialog.show({ message: '已成功开启日历权限' })
} catch (err) {
promptAction.showDialog({
alignment: DialogAlignment.Center,
message: '调用日历功能需要开启日历权限,请在设置中开启权限',
buttons: [
{
text: '取消',
color: '#ff9d9d92'
}, {
text: '去设置',
color: '#ff131312'
}
]
})
.then(res => {
if (res.index === 1) {
permissionManager.openPermissionSettingPage()
}
})
}
})
* */