HarmonyOS 鸿蒙Next开发案例 | 动态申请授权
HarmonyOS 鸿蒙Next开发案例 | 动态申请授权
场景说明
用户授权弹窗的授权只有两个选项:禁止、允许。这意味着用户如果第一次选择了禁止,那么系统就会记住这个选项,以后就不会再弹出授权了。为了避免用户因为误操作或者不了解情况而选择禁止授权,导致应用无法正常运行或者功能受限。本文提供了一种方案,能在应用启动时检测授权,如果应用未被授予必要的权限则弹出自定义弹框引导用户授权。
效果呈现
运行环境
本例基于以下环境开发,开发者也可基于其他适配的版本进行开发:
- IDE: DevEco Studio 3.1.1 Release
- SDK: 3.1.0(API 9)
实现思路
实现用户动态授权功能的过程可以概括为:检测权限、提示授权、跳转授权。具体来说,就是在页面加载时,先调用一个函数来检测用户是否已经拥有应用所需的所有权限。如果用户缺少某些权限,那么应用就需要弹出一个自定义的提示框,向用户解释为什么应用需要这些权限,同时给用户提供一个“去授权”的按钮,让用户可以选择是否去授权。如果用户点击了“去授权”按钮,那么应用就可以跳转到系统的授权界面,让用户可以在那里查看和修改应用的权限设置,用户可以根据自己的意愿来决定是否允许应用使用某些权限。
开发步骤
-
在module.json5文件中声明应用所需要的权限。
"requestPermissions": [ { "name": "ohos.permission.LOCATION_IN_BACKGROUND" } ]
-
创建一个简单的页面,他只包含一段固定文字和一段可变文字,可变文字可以根据变量
grantStatus
的值确定显示的文字内容为已授权还是未授权。@Entry @Component struct Permission { @State grantStatus: number = -1; private context = getContext(this) as common.UIAbilityContext; @State dialogVisible: boolean = false; onPageShow() { this.testPermission() } testPermission() { let atManager = abilityAccessCtrl.createAtManager(); try { atManager.requestPermissionsFromUser(this.context, ['ohos.permission.LOCATION_IN_BACKGROUND'], (err, data)=>{ this.grantStatus = data.authResults[0] //检测权限是否获取 if (this.grantStatus == -1) { this.dialogVisible = true; } else { this.dialogVisible = false; } }); } catch(err) { console.log(`catch err->${JSON.stringify(err)}`); } } build() { Row() { Column() { Text(`ohos.permission.LOCATION_IN_BACKGROUND ${this.grantStatus == -1 ? '未授权' : '已授权'}`) .fontSize(20) .fontWeight(FontWeight.Bold) } .width('100%') } .height('100%') } }
-
重写
onPageShow
函数,在每次页面显示时触发权限判断,调用requestPermissionsFromUser
方法,检查应用是否已经获得所需权限,使用变量grantStatus
存储权限检查结果。 -
创建并显示一个自定义的对话框,在未获取到权限时告知用户为什么需要这个权限,并提供一个“去授权”的按钮,能在用户点击按钮时跳转到权限管理界面。
private dialogController: CustomDialogController = new CustomDialogController({ builder: CustomDialogExample({ context: getContext(this), message: '定位服务已关闭,可能影响应用功能,是否开启定位服务?' }), autoCancel: true, offset: { dx: 0, dy: 270 } }) @CustomDialog struct CustomDialogExample { controller: CustomDialogController private context: any = null; private message: string = ''; startAbility() { //拉起设置 try { var want = { bundleName: 'com.ohos.permissionmanager', abilityName: 'com.ohos.permissionmanager.MainAbility', }; this.context.startAbility(want).then((data) => { console.log("Succeed to start ability with data: " + JSON.stringify(data)) }).catch((error) => { console.error("Failed to start ability with error: " + JSON.stringify(error)) }) } catch (err) { console.log(err) } } build() { Column() { Text(`${this.message}`).width('100%').fontSize(16).padding(25) Divider().width(1) Flex({ justifyContent: FlexAlign.SpaceAround }) { Button('保持关闭') .onClick(() => { this.controller.close() }) .width(136) .height(22) .fontSize(16) .fontColor($r('sys.color.ohos_id_color_text_hyperlink')) .fontWeight(500) .backgroundColor(Color.Transparent) Divider().vertical(true).height(22).color('#182431').opacity(0.6).margin({ left: 8, right: 8 }) Button('去授权') .onClick(() => { this.controller.close() this.startAbility() }) .width(136) .height(22) .fontSize(16) .fontColor($r('sys.color.ohos_id_color_warning')) .fontWeight(500) .backgroundColor(Color.Transparent) }.margin({ bottom: 25 }) } } }
更多关于HarmonyOS 鸿蒙Next开发案例 | 动态申请授权的实战教程也可以访问 https://www.itying.com/category-93-b0.html
楼主您好,我在修改设置应用的包名时一直报错,我用的是本地模拟器,获取到“设置”的包名为com.android.settings,应用权限信息的包名为com.android.permissioncontroller,因为这个报错导致无法直接跳转,我该如何修改呢?
我的代码:
报错:
更多关于HarmonyOS 鸿蒙Next开发案例 | 动态申请授权的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
姓名: 张三
职位: 软件工程师
简介: 拥有超过10年的软件开发经验,擅长Java和Python编程。在多个大型项目中担任核心开发人员,具有丰富的团队协作和项目管理经验。