向用户申请授权:当应用需要访问用户的隐私信息或使用系统能力时,例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等,应该向用户请求授权,用户可以在动态授予权限后通过系统设置来取消应用的权限。
在API23之前,对于授权方式为用户授权的权限,系统设置-应用权限设置页不存在权限是因为应用的权限设置中只展示应用申请过的权限,该特性是系统规格,只有在调用requestPermissionsFromUser这个接口,并且用户选择是否授予权限之后,才会在应用详情页显示该权限开关。从API23开始,系统设置-应用权限设置页会展示所有权限。
getPermissionStatus(permissions: Permissions) {
try {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let data: abilityAccessCtrl.PermissionStatus = atManager.getSelfPermissionStatus(permissions);
console.info(`data->${data}`);
} catch (err) {
console.error(`catch err->${err}`);
}
} reqPermissionFromUser(permissionList: Array<Permissions>) {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
atManager.requestPermissionsFromUser(context, permissionList,
(err: BusinessError, data: PermissionRequestResult) => {
if (err) {
console.error(`requestPermissionsFromUser fail, err->${err}`);
} else {
console.info(`data permissions: ${data.permissions}`);
console.info(`data authResults: ${data.authResults}`);
}
});
} applyPermissionsOnStartAbility() {
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
context?.startAbility({
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry', // uri为空的时候,拉起设置主页面
parameters: {
pushParams: 'com.example.xxx' // 传要跳转的对应应用的包名
}
});
} 效果图如下:

applyPermissionsOnSetting(permissionList: Array<Permissions>) {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
atManager.requestPermissionOnSetting(context, permissionList)
.then((data: Array<abilityAccessCtrl.GrantStatus>) => {
console.info(`data: ${data}`);
})
.catch((err: BusinessError) => {
console.error(`data: ${err}`);
});
} 效果图如下:

完整代码如下:
import { abilityAccessCtrl, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
build() {
Column() {
Button('查询授权状态').onClick(() => {
this.getPermissionStatus('ohos.permission.CAMERA');
});
Button('首次申请授权').onClick(() => {
this.reqPermissionFromUser(['ohos.permission.CAMERA']);
});
Button('非首次申请方式一').onClick(() => {
this.applyPermissionsOnStartAbility();
});
Button('非首次申请授权方式二').onClick(() => {
this.applyPermissionsOnSetting(['ohos.permission.CAMERA']);
});
}
.height('100%')
.width('100%');
}
getPermissionStatus(permissions: Permissions) {
try {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let data: abilityAccessCtrl.PermissionStatus = atManager.getSelfPermissionStatus(permissions);
console.info(`data->${data}`);
} catch (err) {
console.error(`catch err->${err}`);
}
}
reqPermissionFromUser(permissionList: Array<Permissions>) {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
atManager.requestPermissionsFromUser(context, permissionList,
(err: BusinessError, data: PermissionRequestResult) => {
if (err) {
console.error(`requestPermissionsFromUser fail, err->${err}`);
} else {
console.info(`data permissions: ${data.permissions}`);
console.info(`data authResults: ${data.authResults}`);
}
});
}
applyPermissionsOnStartAbility() {
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
context?.startAbility({
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry', // uri为空的时候,拉起设置主页面
parameters: {
pushParams: 'com.example.xxx' // 传要跳转的对应应用的包名
}
});
}
applyPermissionsOnSetting(permissionList: Array<Permissions>) {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
atManager.requestPermissionOnSetting(context, permissionList)
.then((data: Array<abilityAccessCtrl.GrantStatus>) => {
console.info(`data: ${data}`);
})
.catch((err: BusinessError) => {
console.error(`data: ${err}`);
});
}
}