【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解

前言

随着春节假期结束各行各业复产复工,一年一度的春招也持续火热起来。最近,有招聘平台发布了《2024年春招市场行情周报(第一期)》。总体来说今年的就业市场还是人才饱和的状态,竞争会比较激烈。
但是,通过报告我们也能看到让人眼前一亮的信息,比如华为鸿蒙系统对应的人才市场就呈现出“供需两旺”的场景。
不久前华为已经宣布全新HarmonyOS NEXT 鸿蒙星河版将在今年秋天正式和消费者见面,并已经面向开发者开放申请。鸿蒙星河版会有更智能、更极致的原生体验,也标志着鸿蒙迈向其发展的第二阶段。
因此,对于鸿蒙生态建设而言,2024年可谓至关重要,而生态建设的前提,就是要有足够的开发人才。与之对应的,今年春招市场上与鸿蒙相关岗位和人才旺盛的热度,一方面反应了鸿蒙生态的逐渐壮大,另一方面也让人们对鸿蒙下一阶段的发展更具信心。
随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的增长。这对于想要换赛道的程序员来说是一个非常好的消息,话说大家最近有想法转型鸿蒙开发吗?

针对权限等级,相对于主体来说,会有不同的细分概念。

一、权限APL等级:

首先在鸿蒙系统中,对于权限本身,分为三个等级:normal,system_basic,system_core。

1.普通应用为normal,可以访问相机,WIFI信息等资源

2.特殊应用为system_basic,可以访问例如用户身份认证等资源。

3.系统应用为system_core,所有系统资源都可访问。

该权限等级的划分原则是,授予的权限对用户隐私以及操作系统带来的风险程度。

二、授权方式

对于系统授权给应用的方式不同,分为两种授权system_grant、user_grant:

1.system_grant(系统授权),只要应用配置了,系统默认会授权。
2.user_grant(用户授权),应用需要配置,并且要在对应功能调用前主动申请,让用户抉择是否授权。

三、访问控制列表ACL

针对以上介绍,有一种场景需要解决,即:低APL等级的应用,某个业务场景需要使用高等级的权限。此时就需要ACL这种机制,为该应用,对于受限的权限单独开放绿色通道,可以访问。

如果应用涉及获取受限权限,在应用发布上架时,应用市场(AGC)将根据应用的使用场景审核是否
可以使用对应的受限权限。如不符合,应用的上架申请将被驳回。

受限开放的权限通常是不允许三方应用申请的。如果有特殊场景需要使用,请提供相关申请材料到应用市场(AGC)申请相应权限证书。

整个过程很麻烦,建议使用Picker/控件等替代方案。

四、一般应用Normal等级,权限申请处理路径:

在这里插入图片描述

五、权限申请代码示例:

1. 首先我们需要在配置中对权限进行声明,以马达振动和相机权限为例:

在对应模块的module.json5配置中,添加requestPermissions节点和对应权限的配置:

{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet",
      "2in1"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:layered_image",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ]
      }
    ],
    // 在对应模块的module.json5配置中,添加requestPermissions节点和对应权限的配置:
    "requestPermissions": [
      {
      	// 马达振动作为系统权限,不需要用户授权同意
        "name": "ohos.permission.VIBRATE"
      },
      {
  		// 相机权限为用户权限,需要用户授权同意。所以要对权限使用的原因和场景进行描述。
        "name": "ohos.permission.CAMERA",
        "reason": "$string:Camera_reason",
        "usedScene": {
          "when": "always"
        }
      }
    ]
  }
}

具体权限对应的分类参见:应用权限列表 如果不能访问说明不是白名单账户。

2.用户授权的权限在功能使用前,需要进行授权申请。

传统应用开发请求权限时,特别是Android,一般是在应用启动时进行申请。这种方式用户体验很差,自从IOS要求应用在用户不授权时,也能使用其他非授权功能的政策后。

目前应用授权的主流方式,已从应用开屏贴脸找用户要权限。进化为,点击启用某个业务功能时再授权。例如调用相机时,一般会从唤起相机功能的入口按钮处进行授权申请,用户不同意就不让用户进入,并且tips提示用户。

注意:主动申请用户判定是否授权时,若用户拒绝了该授权。之后应用再申请该权限,默认就会返回失败。需要通知用户去设置界面,给该权限授权。就不能通过弹框的形式直接处理了,此时授权场景已经转交给系统。

import { abilityAccessCtrl, common } from '@kit.AbilityKit';

/**
 * 权限工具
 */
export class PermissionsUtil{

  static async reqPermissionsFromUser(): Promise<number[]> {
    let context = getContext() as common.UIAbilityContext;
    let atManager = abilityAccessCtrl.createAtManager();
    let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.CAMERA']);
    return grantStatus.authResults;
  }

  /**
   * 申请相机权限
   * @returns 
   */
  static async requestCameraPermission() {
    let grantStatus = await PermissionsUtil.reqPermissionsFromUser()
    for (let i = 0; i < grantStatus.length; i++) {
      if (grantStatus[i] === 0) {
        // 用户授权,可以继续访问目标操作
        return true;
      }
    }
    return false;
  }
}

dart复制代码import { PermissionsUtil } from '../../utils/PermissionsUtil';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';

/**
 * 多层嵌套刷新渲染
 */
@Entry
@Component
struct permissionPage {

  private TAG: string = "permissionPage";

  private showToast(content: string){
    try {
      promptAction.showToast({
        message: content,
        duration: 2000
      });
    } catch (error) {
      let message = (error as BusinessError).message
      let code = (error as BusinessError).code
      console.error(this.TAG, `showToast args error code is ${code}, message is ${message}`);
    };
  }

  onClickCamera = async ()=>{
    console.log(this.TAG, " onClickCamera");
    let isUserGrant: boolean = await PermissionsUtil.requestCameraPermission();
    if(isUserGrant){
      this.showToast("用户同意授权");
    }else{
      this.showToast("用户拒绝授权");
    }
  }

  build() {
    Row(){
      Button("调用相机")
        .fontSize(px2vp(42))
        .size({
          width: px2vp(350),
          height: px2vp(200)
        })
        .onClick(this.onClickCamera)
    }
    .size({
      width: "100%",
      height: "100%"
    })
    .justifyContent(FlexAlign.Center)
  }
}

写在最后

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。随着鸿蒙的不断发展以及国家的大力支持,未来鸿蒙职位肯定会迎来一个大的爆发,只有积极应对变化,不断学习和提升自己,我们才能在这个变革的时代中立于不败之地。
在这里插入图片描述

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值