Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【HarmonyOS】应用权限原理和封装

【HarmonyOS】应用权限原理和封装

原创
作者头像
钟子翔
发布于 2024-12-24 08:39:48
发布于 2024-12-24 08:39:48
11800
代码可运行
举报
文章被收录于专栏:HarmonyOSNextHarmonyOSNext
运行总次数:0
代码可运行

背景


在项目中,避免不了需要调用系统资源和系统能力,比如:日历读写、摄像头等。因此,需要了解对系统资源访问权限的申请方式方法。

授权方式


包括两种授权方式,分别是system_grant(系统授权) 和 user_grant(用户授权)。

system_grant(系统授权)

仅需要在module.json5文件中,标注需要的权限,应用打开时,系统会自动赋予需要的权限。

user_grant(用户授权)

需要在项目中向系统发送申请,然后由用户决定是否给应用提供需要的权限。

应用的授权等级(APL)


一共有三个等级:normal、system_basic、system_core。权限等级依次提高。

  • normal 等级是全部应用都可以使用
  • system_basic 等级是需要申请签名证书后,才能使用
  • system_core 等级是对系统应用开放,对第三方应用不开放

应用权限

封装代码


PermissionUtils类

封装了三个常用的方法:

  • 检查权限是否授权(CheckPermissions)
  • 申请授权(RequestPermissions)
  • 打开系统设置的权限管理页面(OpenPermissionSettingsPage)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';

/**
 *权限封装类
 */
export class PermissionUtils {
  /**
   * 检查权限是否授权(完全授权)
   * @param permissionsArr 权限集合
   * @returns true:已经全部授权;false:没有全部授权
   */
  public static CheckPermissions(permissionsArr: Permissions[]): boolean {
    const atManager = abilityAccessCtrl.createAtManager();
    //获取bundle信息
    const bundleInfo =
      bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
    // 拿到当前应用的tokenID 标识
    const tokenID = bundleInfo.appInfo.accessTokenId
    //校验应用是否被授予权限
    let result: boolean = true;
    permissionsArr.forEach((x: Permissions, index: number) => {
      if (!(atManager.checkAccessTokenSync(tokenID, x) === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)) {
        result = false;
        return;
      }
    })
    return result;
  }

  /**
   * 申请授权(首次弹窗申请)
   * @param permissionList 权限集合
   * @returns true:权限完全加载;false:有权限没有加载
   */
  public static async RequestPermissions(permissionList: Permissions[]): Promise<boolean> {
    // 程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager();
    // 拉起弹框请求用户授权
    const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissionList)
    // 获取请求权限的结果
    const isAuth = grantStatus.authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    // 返回 Promise 授权结果
    return isAuth ? Promise.resolve(true) : Promise.reject(false)
  }

  /**
   * 打开系统设置的权限管理页面
   */
  public static OpenPermissionSettingsPage() {
    // 获取上下文
    const context = getContext() as common.UIAbilityContext
    // 获取包信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 打开系统设置页
    context.startAbility({
      bundleName: 'com.huawei.hmos.settings',
      abilityName: 'com.huawei.hmos.settings.MainAbility',
      uri: 'application_info_entry',
      parameters: {
        // 按照包名打开对应设置页
        pushParams: bundleInfo.name
      }
    })
  }
}

index界面

添加三个按钮分别测试对应的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { PermissionUtils } from '../Utils/PermissionsUtils';
import { promptAction } from '@kit.ArkUI';
import { Permissions } from '@kit.AbilityKit';

@Entry
@Component
struct Index {
  permissionList: Permissions[] = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'];

  build() {
    Column() {
      Button("检查日历权限是否获取")
        .width(200)
        .height(50)
        .margin({ bottom: 10 })
        .onClick((event: ClickEvent) => {
          const checkResult =
            PermissionUtils.CheckPermissions(this.permissionList);
          if (checkResult) {
            promptAction.showToast({
              message: "已经获取日历相关操作权限",
              duration: 2000
            });
          } else {
            promptAction.showToast({
              message: "没有日历相关操作权限",
              duration: 2000
            });
          }
        })
      Button("获取日历权限")
        .width(200)
        .height(50)
        .margin({ bottom: 10 })
        .onClick(async (event: ClickEvent) => {
          let result = await PermissionUtils.RequestPermissions(this.permissionList);
          if (result) {
            promptAction.showToast({
              message: "成功获取日历相关操作权限",
              duration: 2000
            });
          } else {
            promptAction.showToast({
              message: "日历相关操作权限获取失败",
              duration: 2000
            });
          }
        })
      Button("打开权限设置页面")
        .width(200)
        .height(50)
        .margin({ bottom: 10 })
        .onClick((event: ClickEvent) => {
          PermissionUtils.OpenPermissionSettingsPage();
        })

    }
    .height('100%')
    .width('100%')
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
  }
}

需要注意的是,所有的权限都需要先去module.json5中配置权限:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"requestPermissions": [
      {
        "name": 'ohos.permission.READ_CALENDAR',
        "reason": "$string:CalendarRead",
        "usedScene": {

        }
      },
      {
        "name": 'ohos.permission.WRITE_CALENDAR',
        "reason": "$string:CalenderWrite",
        "usedScene": {
        }
      }
    ]

模拟器中询问受限制的权限

下图的权限,可以在模拟器的调试阶段,使用自动签名的方式使用:

如果没有自动签名时,添加这些权限在module.json5文件中,编辑会报错。

需要注意的点:

  • 确保已经连接真机或模拟器
  • 打开项目结构,然后勾选自动生成签名文件
  • 在项目的build-profile.json5文件下,查看signingConfigs下是否签名成功

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
鸿蒙Next应用权限管理
简介: 系统提供了一种允许应用访问系统资源(如:通讯录等)和系统能力(如:访问摄像头、麦克风等)的通用权限访问方式,来保护系统数据(包括用户个人数据)或功能,避免它们被不当或恶意使用。 授权方式: system_grant(系统授权)指的是系统授权类型,如果在应用中申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。 user_grant(用户授权)指的是用户授权类型,该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。
用户4773577
2025/06/27
850
《仿盒马》app开发技术分享-- 原生地图展示(26)
上一节我们实现了获取当前用户的位置,并且成功的拿到了经纬度,这一节我们就要根据拿到的经纬度,结合我们其他的知识点来实现地图的展示。
用户10696402
2025/06/23
420
鸿蒙应用开发-录音保存并播放音频
录音并保存为m4a格式的音频,然后播放该音频,参考文档使用AVRecorder开发音频录制功能(ArkTS),更详细接口信息请查看接口文档:@ohos.multimedia.media (媒体服务)。
夜雨飘零
2024/05/26
5131
鸿蒙应用开发-录音保存并播放音频
HarmonyOS NEXT 权限申请系统授权和用户授权权限
在鸿蒙原生开发中,我们normal级别的证书能够使用的权限分为系统授权权限和用户授权权限
水滴石轩
2025/03/17
3000
HarmonyOS NEXT 权限申请系统授权和用户授权权限
鸿蒙开发:权限授权封装
关于权限相关的知识点,陆陆续续分享了三篇了,也在前边的文章中关于权限的状态获取,以及权限的申请也做了原生代码的案例分享,本篇文章,我们把权限授权封装一下,便于在实际的开发中灵活的使用。
程序员一鸣
2025/03/18
1150
鸿蒙开发:权限授权封装
HarmonyOS访问控制授权申请
应用的APL(Ability Privilege Level)等级分为normal,system_basic和system_core三个等级,默认情况下,应用的APL等级都为normal等级。权限类型分为system_grant和user_grant两种类型。应用可申请的权限项参见应用权限列表。
酒楼
2023/11/25
7150
我写个HarmonyOS Next版本的微信聊天02-完结篇
应用需要在module.json5配置文件的requestPermissions标签中声明权限。
万少
2025/02/09
2030
我写个HarmonyOS Next版本的微信聊天02-完结篇
鸿蒙开发:Calendar Kit日历管理
Calendar Kit为用户提供了一系列接口来获取日历账户,并使用特定的接口向日历账户中写入日程。
钟子翔
2024/12/24
2120
三文带你轻松上手鸿蒙的AI语音01-实时语音识别
HarmonyOSNext中集成了强大的AI功能。Core Speech Kit(基础语音服务)是它提供的众多AI功能中的一种。
万少
2025/02/09
2910
三文带你轻松上手鸿蒙的AI语音01-实时语音识别
鸿蒙原生应用开发【分布式数据对象】
在可信组网环境下,多个相互组网认证的设备将各自创建的对象加入同一个 sessionId,使得加入的多个数据对象之间可以同步数据,也就是说,当某一数据对象属性发生变更时,其他数据对象会检测到这一变更,同时将自身属性更新。此时,该 sessionId 下的所有数据对象属性相同,这样的数据对象称之为分布式数据对象。此外,分布式数据对象可以被动退出 sessionId,当分布式数据对象退出 sessionId 后,该对象将检测不到其他对象的变更。
小帅聊鸿蒙
2024/06/28
1400
鸿蒙原生应用开发【分布式数据对象】
harmony-utils之PermissionUtil,授权相关工具类
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。 picker_utils 是harmony-utils拆分出来的一个子库,包含PickerUtil、PhotoHelper、ScanUtil。
童长老
2025/06/28
1040
鸿蒙开发:申请授权权限
通过前面两章的概述,关于权限的基本知识点已经概述的七七八八了,那么本篇文章,我们着重概述一下如何去申请权限。
程序员一鸣
2025/03/17
2030
鸿蒙开发:申请授权权限
鸿蒙应用开发-录音并使用WebSocket实现实时语音识别
录音并实时获取RAW的音频格式数据,利用WebSocket上传数据到服务器,并实时获取语音识别结果,参考文档使用AudioCapturer开发音频录制功能(ArkTS),更详细接口信息请查看接口文档:AudioCapturer8+和@ohos.net.webSocket (WebSocket连接)。
夜雨飘零
2024/05/26
7430
鸿蒙应用开发-录音并使用WebSocket实现实时语音识别
高质量 HarmonyOS 应用权限管控流程
在 HarmonyOS 应用开发过程中,往往会涉及到敏感数据和硬件资源的调动和访问,而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解,才可以在应用开发中提高效率和避免踩坑。
万少
2025/02/10
2060
高质量 HarmonyOS  应用权限管控流程
鸿蒙开发学习:定位相关知识(Locationkit)
LocationKit提供了定位服务、地理围栏、地理编码、逆地理编码和国家码等功能。
钟子翔
2024/12/24
1200
【HarmonyOS 5】鸿蒙分布式协同应用开发详解
首先是因为当今社会,围绕电子产品生态,人们迫切希望,周边的电子设备可以协同操作。例如手机,手表,电视机,汽车,甚至是各种家电产品。
GeorgeGcs
2025/06/19
820
【HarmonyOS 5】鸿蒙分布式协同应用开发详解
HarmonyOS 开发实践 —— 基于@ohos.pasteboard实现剪贴板功能
本模块主要提供管理系统剪贴板的能力,为系统复制、粘贴功能提供支持。系统剪贴板支持对文本、HTML、URI、Want、PixelMap等内容的操作。
小帅聊鸿蒙
2024/12/01
2490
HarmonyOS 开发实践 —— 基于@ohos.pasteboard实现剪贴板功能
Flutter_udid 三方库鸿蒙适配之旅:从零到一的深度实践
在数字化浪潮的推动下,跨平台开发框架如 Flutter 凭借其高效、便捷的特性,成为了开发者们的宠儿。而鸿蒙系统的崛起,更是为跨平台开发注入了新的活力。为了助力开发者在鸿蒙生态中快速实现 Flutter_udid 获取设备标识符功能,本文将深入浅出地为大家解析如何适配 Flutter_udid 三方库至鸿蒙平台。
徐建国
2025/04/24
1570
Flutter_udid 三方库鸿蒙适配之旅:从零到一的深度实践
HarmonyOS实战:高德地图自定义定位图标展示
地图定位功能基本上已经成了日常应用程序的必备功能之一,在日常开发地图定位的功能的时候难免会遇到很多意想不到的问题,本篇文章记录日常开发过程中的细节与完整的流程,帮助更多的开发者避免遇到类似的问题,建议点赞收藏!
IT小码哥
2025/05/22
1420
自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
这次的目标是学习和使用HarmonyOS的Calendar Kit功能,特别是最新的API 13版本。Calendar Kit让我感受到了一种与传统开发完全不同的体验——它提供的不只是简单的日历功能,而是一套集创建、查询、更新、删除等强大能力于一体的日程管理服务。
李游Leo
2024/12/31
2920
自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
相关推荐
鸿蒙Next应用权限管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验