鸿蒙权限管理
·
此文章内容兼容API12,使用harmony next应用开发
权限说明
1,权限类型
- 数据
(1)个人数据:照片、通讯录、日历、位置等
(2)设备数据:设备标识、相机、麦克风 - 功能
(1)设备功能:访问摄像头、麦克风、打电话、联网
(2)应用功能:弹出悬浮窗、创建快捷方式
2,权限分类
- 系统授权 system_grant
(1)配置文件中声明后,系统在安装时自动授予权限 - 用户授权 user_grant
(1)不仅需要配置文件声明,还需要动态申请权限,确认用户授权才能进行下一步操作
2,权限申请
(1)所有权限必须声明在配置文件
(2)敏感权限必须动态申请,必须填写权限使用理由字段。 敏感权限:地理位置、相机、麦克风、日历、健身运动、身体传感器、音乐、文件、图片视频等
(3)权限组,会将多个权限组合在一起。见 应用权限组列表
3,可申请单次授权,“仅本次允许/允许本次使用”
仅支持下列权限:
- 剪切板:[“ohos.permission.READ_PASTEBOARD”]
- 模糊位置:[“ohos.permission.APPROXIMATELY_LOCATION”]
- 位置:[“ohos.permission.LOCATION”]
- 后台位置:[“ohos.permission.LOCATION_IN_BACKGROUND”]
代码样例
1,配置文件声明
{
"module": {
...
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
}]
...
}
}
2,检查是否已授权
使用前必须检查是否已有该权限;
public static checkAccessToken(permission: Permissions): abilityAccessCtrl.GrantStatus {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
// 获取应用程序的accessTokenID
let tokenId: number = 0;
try {
let bundleInfo: bundleManager.BundleInfo =
bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
tokenId = appInfo.accessTokenId;
} catch (error) {
const err: BusinessError = error as BusinessError;
console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
}
// 校验应用是否被授予权限
try {
grantStatus = atManager.checkAccessTokenSync(tokenId, permission);
} catch (error) {
const err: BusinessError = error as BusinessError;
console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
}
return grantStatus;
}
-------------------------
const permissions: Array<Permissions> = ['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'];
async function checkPermissions(): Promise<void> {
let grantStatus: abilityAccessCtrl.GrantStatus = await checkPermissionGrant(permissions[0]);
if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
// 已经授权,可以继续访问目标操作
} else {
// 申请位置权限
}
}
3,动态申请授权
此方法必须依附 UIAbility 或 UIExtensionAbility 类型引用
public static reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext,
reject: () => void, success: () => void) {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
atManager.requestPermissionsFromUser(context, permissions).then((data) => {
let grantStatus: Array<number> = data.authResults;
let length: number = grantStatus.length;
for (let i = 0; i < length; i++) {
if (grantStatus[i] === 0) {
} else {
// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
reject()
return;
}
}
success()
// 授权成功
}).catch((err: BusinessError) => {
console.error(`zhf Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
})
}
----------------------------------------
PermissionUtil.reqPermissionsFromUser(permissions,getContext(this) as common.UIAbilityContext,
() => {
//用户拒绝某些权限
deny()
this.showSecondPermissionDialog(permissions)
},
() => {
//都已授权
grant();
})
4,处理授权结果
结束后必须确认用户已授权才能进行下一步;若用户拒绝授权后,将无法再次拉起弹出,可以引导跳转设置页面手动授权
5,跳转设置页面,申请授权
public static goSystemPermissionSetting(permissions: Array<Permissions>,context: common.UIAbilityContext){
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionOnSetting(context, permissions)
}
权限API
1,配置文件中,requestPermissions 属性
| 属性名 | 含义 | 数据类型 | 是否必填 | 赋值解释 |
|---|---|---|---|---|
| name | 权限名称 | string | 是 | 必须是系统定义的权限名称 应用权限列表 |
| reason | 申请权限的原因 | string | user_grant权限时必填;system_grant 选填 | 使用string类资源引用。格式为$string: ***。 |
| usedScene | 权限使用的场景,{ abilities ,when } | 对象 | 必填 | – |
abilities :使用权限的UIAbility或者ExtensionAbility组件的名称,可选
when:调用时机。可选,但只能填入 [ inuse(使用时)、always(始终),不能为空。 ]
其他
1,子模块中申请的权限,无需再主项目重复添加
2,用户拒绝后将无法再次拉起弹出,可以引导跳转设置页面手动受于权限
更多推荐


所有评论(0)