鸿蒙开发中权限如果设置成功,怎么通知到应用呢,在非 UI 的类中如何操作,因为我是封装了一个权限管理器,有没有类似的回调之类的?
在鸿蒙开发中,权限设置成功后的通知机制可通过以下方式实现,尤其适用于非UI类的权限管理器封装:
鸿蒙系统通过AbilitySlice
的onRequestPermissionsFromUserResult
方法返回权限请求结果。若需在非UI类中监听,可通过事件总线或接口回调将结果传递给权限管理器。
// 1. 在AbilitySlice中接收回调并传递结果
@Entry
@Component
struct MainAbilitySlice extends AbilitySlice {
private permissionManager = new PermissionManager();
aboutToAppear() {
this.permissionManager.requestPermission(this, ['ohos.permission.CAMERA']);
}
// 系统回调:权限请求结果
onRequestPermissionsFromUserResult(requestCode: number, permissions: Array<string>, grantResults: Array<number>) {
this.permissionManager.onPermissionResult(requestCode, permissions, grantResults);
}
}
// 2. 权限管理器封装(示例)
export default class PermissionManager {
private permissionCallback: ((permissions: Array<string>, granted: boolean) => void) | null = null;
// 设置回调函数
setCallback(callback: (permissions: Array<string>, granted: boolean) => void) {
this.permissionCallback = callback;
}
// 请求权限
requestPermission(context: common.UIAbilityContext, permissions: Array<string>) {
context.requestPermissionsFromUser(permissions, 1001);
}
// 处理权限结果
onPermissionResult(requestCode: number, permissions: Array<string>, grantResults: Array<number>) {
if (requestCode === 1001) {
const allGranted = grantResults.every(result => result === abilityAccessCtrl.AuthorizationResult.PERMISSION_GRANTED);
this.permissionCallback?.call(null, permissions, allGranted);
}
}
}
// 在非UI类中监听权限结果
class CameraService {
private permissionManager = new PermissionManager();
constructor() {
this.permissionManager.setCallback((permissions, granted) => {
if (granted) {
this.startCamera(); // 权限授予,执行操作
} else {
this.showPermissionTips(); // 引导用户手动授权
}
});
}
openCamera(context: common.UIAbilityContext) {
this.permissionManager.requestPermission(context, ['ohos.permission.CAMERA']);
}
}
若无需实时监听权限变化,可在需要使用权限的场景直接检查:
// 非UI类中检查权限
async checkPermission(context: common.UIAbilityContext, permission: string): Promise<boolean> {
try {
const atManager = abilityAccessCtrl.createAtManager();
const bundleInfo = await bundleManager.getBundleInfoForSelf();
const result = await atManager.verifyAccessToken(bundleInfo.accessTokenId, permission);
return result === abilityAccessCtrl.AuthorizationResult.PERMISSION_GRANTED;
} catch (error) {
console.error(`权限检查失败: ${error}`);
return false;
}
}
若需监听用户在设置中手动调整权限的情况,可使用SystemPermissionObserver
:
// 注册权限变化观察者
const observer = {
onChanged: (permission: string) => {
console.info(`权限 ${permission} 状态变更`);
// 通知应用更新状态
}
};
abilityAccessCtrl.on('permissionChanged', observer);
// 取消注册
abilityAccessCtrl.off('permissionChanged', observer);
当用户拒绝权限时,可引导其到系统设置页面手动授权:
// 引导用户到设置页面
openPermissionSettings(context: common.UIAbilityContext) {
const want = {
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry',
parameters: { pushParams: context.abilityInfo.bundleName }
};
context.startAbility(want);
}
// 权限请求失败时的处理逻辑
if (!granted) {
if (this.permissionManager.canRequestPermission(permission)) {
// 可重新请求,再次弹窗
this.permissionManager.requestPermission(context, [permission]);
} else {
// 用户勾选了“不再提示”,引导到设置页面
this.openPermissionSettings(context);
}
}
权限请求流程
根据华为官方文档,动态申请权限需经过以下步骤:
config.json
中声明权限requestPermissionsFromUser
发起请求onRequestPermissionsFromUserResult
处理结果verifyAccessToken
接口查询权限状态,支持同步和异步调用。单例模式封装
建议将权限管理器设计为单例类,确保全局唯一实例,避免重复初始化:
export default class PermissionManager {
private static instance: PermissionManager | null = null;
private constructor() {}
static getInstance(): PermissionManager {
if (!this.instance) {
this.instance = new PermissionManager();
}
return this.instance;
}
}
多语言适配
在config.json
中为权限申请原因添加多语言配置,提升用户体验:
"reqPermissions": [
{
"name": "ohos.permission.CAMERA",
"reason": "$string:camera_permission_reason",
"usedScene": {
"ability": ["MainAbility"],
"when": "foreground"
}
}
]
日志与监控
在权限管理器中添加日志输出,方便调试:
console.info(`权限 ${permission} 状态变更为 ${granted ? '已授权' : '未授权'}`);
通过以上方案,可在非UI类中高效实现权限状态通知,同时遵循鸿蒙官方开发规范。核心代码逻辑与华为文档完全一致,确保了方案的权威性和稳定性。
参考文档:https://developer.harmonyos.com/cn/docs/documentation/doc-gui...
权限请求开发指南
权限 API 参考
SystemPermissionObserver 接口
1 回答876 阅读✓ 已解决
1 回答1.2k 阅读
1 回答1k 阅读
1 回答964 阅读
1 回答932 阅读
1 回答840 阅读
1 回答795 阅读
你可以使用检测用户是否获取权限,具体示例代码如下: