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

news2024/9/24 6:58:41

背景


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

授权方式


包括两种授权方式,分别是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)
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界面

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

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中配置权限:

"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下是否签名成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ruoyi源码解析学习 - 微服务版 - ruoyi-gateway

com.ruoyi.gateway 今天简单看看若依的gateway的配置模块干了啥 最近面试很多外包公司&#xff0c;都对低代码平台有点要求&#xff0c;这些代码虽说用起来不费劲&#xff0c;但是其中还是有很多细节能让我学习学习的。&#xff08;微服务版&#xff0c;上次搞jeecgboot的笔试…

R包安装教程,如何安装rjags和infercnv

一.介绍 在数据分析过程中&#xff0c;R语言因其强大的统计分析能力和丰富的包生态系统&#xff0c;成为众多研究人员和数据科学家的首选工具。本文将详细介绍如何在R环境中安装两个重要的R包——rjags和infercnv。rjags用于与JAGS&#xff08;Just Another Gibbs Sampler&…

热斑黄斑光伏发电板 红外黄斑检测图像数据集内含最高温度信息 1200张,jpg格式。

热斑黄斑光伏发电板 红外黄斑检测图像数据集 内含最高温度信息 1200张&#xff0c;jpg格式。 热斑黄斑光伏发电板红外黄斑检测图像数据集介绍 数据集名称 热斑黄斑光伏发电板红外黄斑检测图像数据集&#xff08;Hot Spot and Yellow Spot Detection in Photovoltaic Panels I…

Linux下进程通信与FIFO操作详解

Linux下进程通信与FIFO操作详解 一、命名管道(FIFO)概述1.1 命名管道的特点1.2 创建命名管道二、命名管道的操作2.1 打开命名管道2.2 读写命名管道2.3 关闭命名管道三、命名管道的使用实例3.1 命名管道的创建和通信过程3.1.1 发送方(writer)3.1.2 接收方(reader)3.2 运行…

java项目之健身房管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的健身房管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 健身房管理系统的主要使用…

Java框架学习(Spring)(tx)(03)

简介&#xff1a;以本片记录在尚硅谷学习ssm-spring-tx时遇到的小知识 详情移步&#xff1a;想参考的朋友建议全部打开相互配合学习&#xff01; 视频&#xff1a; 057-spring-tx-编程式和声明式事务理解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1AP411s7D7?p5…

第九节 Opencv自带颜色表操作

知识点&#xff1a;Look Up lTable&#xff08;LUT&#xff09;查找表 了解LUT查找表的作用与用法&#xff0c;代码实现与API介绍 -applyColorMap&#xff08;src,dst,COLORMAP&#xff09; -src表示输入图像 -dst表示输出图像 匹配到的颜色LUT&#xff0c;Opencv支持13种…

Android OpenGLES2.0开发(一):艰难的开始

生而为人&#xff0c;本质上&#xff0c;都是孤独的&#xff01; 引言 我一直觉得OpenGL ES是一块硬骨头&#xff0c;每次用到GLSurfaceView作为Camera的预览视图时&#xff0c;总是去网上找现成的代码。CtrlC和CtrlV之后总有一种沾沾自喜的感觉&#xff0c;但是你要让我改里面…

JavaScript --- 字符串常用方法(1)

chartAt(索引)&#xff0c;返回索引对应字符 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

Java | Leetcode Java题解之第433题最小基因变化

题目&#xff1a; 题解&#xff1a; class Solution {public int minMutation(String start, String end, String[] bank) {int m start.length();int n bank.length;List<Integer>[] adj new List[n];for (int i 0; i < n; i) {adj[i] new ArrayList<Intege…

chsharp文件如何查找在unity中使用的 位置?

在 Unity 中&#xff0c;C 脚本文件&#xff08;.cs 文件&#xff09;被用于控制游戏对象的行为。要查找某个 C 文件在 Unity 项目中被使用的位置&#xff0c;你可以通过以下几种方法&#xff1a; 1. 查找依赖项&#xff08;References&#xff09; Unity 提供了一个工具&#…

物联网助力智慧交通:优势与前景

智慧交通是当今城市发展的必然趋势&#xff0c;而物联网技术在交通运输领域的应用正是为实现智慧交通建设提供了前所未有的机遇和优势。物联网作为连接和控制物理世界的重要技术手段&#xff0c;在交通领域的应用极大地改善了交通系统的效率、安全性和环保性。 首先&#xff0c…

LabVIEW软件出现Bug如何解决

在LabVIEW开发中&#xff0c;程序出现bug是不可避免的。无论是小型项目还是复杂系统&#xff0c;调试与修复bug都是开发过程中的重要环节。下文介绍如何有效解决LabVIEW软件中的bug&#xff0c;包括常见错误类型、调试工具、错误处理机制。 1. 常见Bug类型分析 在LabVIEW中&am…

使用vite+react+ts+Ant Design开发后台管理项目(二)

前言 本文将引导开发者从零基础开始&#xff0c;运用、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术工具…

C语言 | Leetcode C语言题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; #define MAX_LEVE_SIZE 1000 #define MAX_NODE_SIZE 10000int** levelOrder(struct Node* root, int* returnSize, int** returnColumnSizes) {int ** ans (int **)malloc(sizeof(int *) * MAX_LEVE_SIZE);*returnColumnSizes (int *)mal…

如何利用 opencv 进行 ROI(感兴趣)获取和实现 VR(虚拟现实) 演播室的播放

我是从事医疗软件的开发的。 经常需要从拍摄的医疗视频中获取出病理区域。并计算病理区域的周长和面积。 用 opencv 的术语,这就是感兴趣区域的获取。 (因为都是实时视频,所以速度很关键。代码效率很重要) 有时,需要标注出病理区域,并将非病理区域从视频中去除掉。 如果将…

云栖大会上我遇见了站长转型自媒体最成功的人

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 非常荣幸参加了第十六届2024云栖大会。文章很短&#xff0c;但很精。 这次大会有3大特点&#xff1a;人巨多、热、信号差&#xff0c;而且云栖大会上我遇见了站长转型自媒体最成功的人。甚至还有人说&#xff1a;云…

光子架与电子架 -- 光子架与电子架

电子架 指插放交叉板、OTU单板、支/线路板、保护类单板的子架。 在通用型平台子架和平台子架中如果仅插放OTU单板&#xff08;非中继模式&#xff09;视为电子架。光电混合的子架视为电子架。 电子架主要实现将客户侧信号转换成标准波长的光信号&#xff0c;供光子架调度。 光子…

免费的高质量、美观的甘特图模板

呈现您的项目规划新高度&#xff0c;精选几款高品质、视觉出众的甘特图模板。 甘特图Excel模板-Ganttable系统风格甘特图Excel模板-专业甘特图Excel模板-浅蓝色甘特图Excel模板-深灰色 这些 Excel 甘特图模板均源自 Ganttable 甘特图AI工具的智能生成与导出。利用 Ganttable&a…

ARM单片机的中断详细过程(重要)

ARM单片机的中断详细过程&#xff08;重要&#xff09; 一、ARM异常中断 ARM的异常&#xff08;中断源&#xff09;总共分为三类&#xff08;八种&#xff09;&#xff1a; 三类&#xff1a; &#xff08;1&#xff09;执行指令引起的直接异常&#xff1a;软件中断&#xff…