HarmonyOS 鸿蒙Next开发案例 | 动态申请授权

HarmonyOS 鸿蒙Next开发案例 | 动态申请授权

场景说明

用户授权弹窗的授权只有两个选项:禁止、允许。这意味着用户如果第一次选择了禁止,那么系统就会记住这个选项,以后就不会再弹出授权了。为了避免用户因为误操作或者不了解情况而选择禁止授权,导致应用无法正常运行或者功能受限。本文提供了一种方案,能在应用启动时检测授权,如果应用未被授予必要的权限则弹出自定义弹框引导用户授权。

效果呈现

image

运行环境

本例基于以下环境开发,开发者也可基于其他适配的版本进行开发:

  • IDE: DevEco Studio 3.1.1 Release
  • SDK: 3.1.0(API 9)

实现思路

实现用户动态授权功能的过程可以概括为:检测权限、提示授权、跳转授权。具体来说,就是在页面加载时,先调用一个函数来检测用户是否已经拥有应用所需的所有权限。如果用户缺少某些权限,那么应用就需要弹出一个自定义的提示框,向用户解释为什么应用需要这些权限,同时给用户提供一个“去授权”的按钮,让用户可以选择是否去授权。如果用户点击了“去授权”按钮,那么应用就可以跳转到系统的授权界面,让用户可以在那里查看和修改应用的权限设置,用户可以根据自己的意愿来决定是否允许应用使用某些权限。

开发步骤

  1. 在module.json5文件中声明应用所需要的权限。

    "requestPermissions": [
      {
        "name": "ohos.permission.LOCATION_IN_BACKGROUND"
      }
    ]
    
  2. 创建一个简单的页面,他只包含一段固定文字和一段可变文字,可变文字可以根据变量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%')
      }
    }
    
  3. 重写onPageShow函数,在每次页面显示时触发权限判断,调用requestPermissionsFromUser方法,检查应用是否已经获得所需权限,使用变量grantStatus存储权限检查结果。

  4. 创建并显示一个自定义的对话框,在未获取到权限时告知用户为什么需要这个权限,并提供一个“去授权”的按钮,能在用户点击按钮时跳转到权限管理界面。

    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

2 回复
楼主您好,我在修改设置应用的包名时一直报错,我用的是本地模拟器,获取到“设置”的包名为com.android.settings,应用权限信息的包名为com.android.permissioncontroller,因为这个报错导致无法直接跳转,我该如何修改呢?

我的代码:

报错:

更多关于HarmonyOS 鸿蒙Next开发案例 | 动态申请授权的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


姓名: 张三
职位: 软件工程师
简介: 拥有超过10年的软件开发经验,擅长Java和Python编程。在多个大型项目中担任核心开发人员,具有丰富的团队协作和项目管理经验。

回到顶部