HarmonyOS-权限管理

news2024/11/4 19:13:18

一. 权限分类

 1. system_grant

system_grant 为系统授权,无需询问用户,常用的权限包括网络请求、获取网络信息、获取wifi信息、获取传感器数据等。

/* system_grant(系统授权)*/
  static readonly INTERNET = 'ohos.permission.INTERNET' // 网路请求
  static readonly GET_NETWORK_INFO = 'ohos.permission.GET_NETWORK_INFO' // 网络信息-读
  static readonly GET_WIFI_INFO = 'ohos.permission.GET_WIFI_INFO' // WIFI信息-读
  static readonly GYROSCOPE = 'ohos.permission.GYROSCOPE' // 陀螺仪传感器
  static readonly ACCELEROMETER = 'ohos.permission.ACCELEROMETER' // 加速度传感器

2. user_grant

user_grant 是需要用户授权的权限,常用的权限包括定位、相机、麦克风、日历、文件读写等。

/* user_grant(用户授权)*/
  static readonly LOCATION = 'ohos.permission.LOCATION' // 定位-精确
  static readonly APPROXIMATELY_LOCATION = 'ohos.permission.APPROXIMATELY_LOCATION' // 定位-模糊
  static readonly LOCATION_IN_BACKGROUND = 'ohos.permission.LOCATION_IN_BACKGROUND' // 定位-后台
  static readonly CAMERA = 'ohos.permission.CAMERA' // 相机
  static readonly MICROPHONE = 'ohos.permission.MICROPHONE' // 麦克风
  static readonly READ_CONTACTS = 'ohos.permission.READ_CONTACTS' // 通讯录-读
  static readonly WRITE_CONTACTS = 'ohos.permission.WRITE_CONTACTS' // 通讯录-写
  static readonly READ_CALENDAR = 'ohos.permission.READ_CALENDAR' // 日历-读
  static readonly WRITE_CALENDAR = 'ohos.permission.WRITE_CALENDAR' // 日历-写
  static readonly WRITE_IMAGEVIDEO = 'ohos.permission.WRITE_IMAGEVIDEO' // 图片视频-写
  static readonly READ_IMAGEVIDEO = 'ohos.permission.READ_IMAGEVIDEO' // 图片视频-读
  static readonly MEDIA_LOCATION = 'ohos.permission.MEDIA_LOCATION' // 多媒体-本地
  static readonly WRITE_AUDIO = 'ohos.permission.WRITE_AUDIO' // 音频-写
  static readonly READ_AUDIO = 'ohos.permission.READ_AUDIO' // 音频-读
  static readonly READ_MEDIA = 'ohos.permission.READ_MEDIA' // 文件-读
  static readonly WRITE_MEDIA = 'ohos.permission.WRITE_MEDIA' // 文件-写
  static readonly APP_TRACKING_CONSENT = 'ohos.permission.APP_TRACKING_CONSENT' // 广告标识符
  static readonly DISTRIBUTED_DATASYNC = 'ohos.permission.DISTRIBUTED_DATASYNC' // 多设备协同
  static readonly ACCESS_BLUETOOTH = 'ohos.permission.ACCESS_BLUETOOTH' // 使用蓝牙能力
  static readonly READ_PASTEBOARD = 'ohos.permission.READ_PASTEBOARD' // 剪贴板
  static readonly READ_HEALTH_DATA = 'ohos.permission.READ_HEALTH_DATA' // 健康数据
  static readonly ACTIVITY_MOTION = 'ohos.permission.ACTIVITY_MOTION' // 健身运动

二. 权限声明 

1. system_grant

在应用 entry 模块的 module.json5 中添加权限声明。

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET"
  }, {
    "name": "ohos.permission.GET_NETWORK_INFO"
  }, {
    "name": "ohos.permission.GET_WIFI_INFO"
  }
]

 2. user_grant

在应用 entry 模块的 module.json5 中添加权限声明。

"requestPermissions": [
  {
    "name": "ohos.permission.LOCATION",
    "reason": "$string:PERMISSION_LOCATION",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when":"inuse"
     }
  },
  {
    "name": "ohos.permission.APP_TRACKING_CONSENT",
    "reason": "$string:PERMISSION_TRACKING_CONSENT",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when":"inuse"
     }
  }
]

三. 权限应用 

1. system_grant

使用该类权限不需要弹窗让用户授权,只需要判断一下该权限在应用中是否声明。

import { abilityAccessCtrl, bundleManager, PermissionRequestResult, Permissions, Want } from '@kit.AbilityKit';

export class PermissionManager {
  async checkPermissions(): void {
    const bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    const tokenId = bundleInfo.appInfo.accessTokenId
    const atManager = abilityAccessCtrl.createAtManager()
    const state = atManager.checkAccessTokenSync(tokenId, 'ohos.permission.INTERNET')

    if (state === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
      console.log('网络请求可用')
    } else {
      console.log('网络请求不可用')
    }
  }
}

2. user_grant

使用该类权限需要先判断用户是否授权,先由用户授权之后再使用该类权限相关的能力。

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

export class PermissionManager {
  async checkPermissions(): Promise<void> {
    const bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    const tokenId = bundleInfo.appInfo.accessTokenId
    const atManager = abilityAccessCtrl.createAtManager()
    const state = atManager.checkAccessTokenSync(tokenId, 'ohos.permission.LOCATION')

    if (state === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
      console.log('定位权限已开启')
    } else {
      const context = AppStorage.get('ability_context') as common.UIAbilityContext // 在EntryAbility中存储AbilityContext
      const result: PermissionRequestResult = await atManager.requestPermissionsFromUser(context, ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'])
      const authResults: Array<number> = result.authResults
      const grantStatus: boolean = (authResults[0] === 0)
      if (grantStatus) {
        console.log('定位权限已开启')
      } else {
        console.log('定位权限未开启')
      }      
    }
  }
}

3. notification

推送通知的权限是基于 notificationMananger 服务实现,不同于 system_agent 和 user_agent。

import notificationManager from '@ohos.notificationManager';

export class PermissionManager {
  async checkNotificationPermissions(): Promise<void> {
    let grantStatus = await notificationManager.isNotificationEnabled()
    if (!grantStatus) {
      await notificationManager.requestEnableNotification()
      grantStatus = await notificationManager.isNotificationEnabled()
      if (!grantStatus) {
        console.log('通知权限未开启')
      } else {
        console.log('通知权限已开启')
      }
    } else {
        console.log('通知权限已开启')
    }
  }
}

4. 跳转到APP设置页

import bundleManager from '@ohos.bundle.bundleManager';
import { common, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export class PermissionManager {
  async gotoSetting(): Promise<void> {
    const bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION
    const bundleParam = bundleManager.getBundleInfoForSelfSync(bundleFlags)
    const bundleId = bundleParam.name

    let wantInfo: Want = {
      bundleName: 'com.huawei.hmos.settings',
      abilityName: 'com.huawei.hmos.settings.MainAbility',
      uri: 'application_info_entry',
      parameters: {
        pushParams: bundleId
      }
    }
    const context = AppStorage.get('ability_context') as common.UIAbilityContext // 在EntryAbility中存储AbilityContext
    context.startAbility(wantInfo).catch((error: BusinessError) => {
      console.error(`startAbility-error: ${JSON.stringify(error)}`)
    })
  }
}

源码参考: harmonyos-permission

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

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

相关文章

前端笔试新问题总结

记录总结下最近遇到的前端笔试新问题 目录 一、操作数组方法 1.Array.isArray(arr) 2.Object.prototype.toString.call(arr) "[object Array]" 3.arr instanceof Array 1&#xff09;跨帧问题 2&#xff09;修改Array.prototype 3&#xff09;模拟数组的对象…

HTML 基础标签——结构化标签<html>、<head>、<body>

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

跳表原理笔记

课程地址 跳表是一种基于随机化的有序数据结构&#xff0c;它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力 创建 首先在头部创建一个 sentinel 节点&#xff0c;然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层 例如上图中&#xff0c;L…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

3674矢量网络分析仪-003噪声系数测量选件

3674X-003 噪声系数测量选件 3674系列矢量网络分析仪 综述 3674X-003噪声系数测量一次连接&#xff0c;可同时测试S参数、噪声系数、噪声参数、增益压缩和变频增益等多种参数。基于冷源噪声系数测试方法&#xff0c;可进行精确的噪声系数和噪声参数测试。 •特点 • 3674X…

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计

本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程&#xff0c;包括设计环境的建立&#xff0c;布图规划包括模块尺寸的确定&#xff0c;IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要&#xff0c; 影响芯片的布线资…

如何将MySQL彻底卸载干净

目录 背景&#xff1a; MySQL的卸载 步骤1&#xff1a;停止MySQL服务 步骤2&#xff1a;软件的卸载 步骤3&#xff1a;残余文件的清理 步骤4&#xff1a;清理注册表 步骤五:删除环境变量配置 总结&#xff1a; 背景&#xff1a; MySQL卸载不彻底往往会导致重新安装失败…

Vue生成名片二维码带logo并支持下载

一、需求 生成一张名片&#xff0c;名片上有用户信息以及二维码&#xff0c;名片支持下载功能&#xff08;背景样式可更换&#xff0c;忽略本文章样图样式&#xff09;。 二、参考文章 这不是我自己找官网自己摸索出来的&#xff0c;是借鉴各位前辈的&#xff0c;学以致用&am…

【AIGC】深入探索『后退一步』提示技巧:激发ChatGPT的智慧潜力

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;“后退一步”技巧介绍技巧目的 &#x1f4af;“后退一步”原理“后退一步”提示技巧与COT和TOT的对比实验验证 &#x1f4af;如何应用“后退一步”策略强调抽象思考引导提…

Python | Leetcode Python题解之第520题检测大写字母

题目&#xff1a; 题解&#xff1a; class Solution:def detectCapitalUse(self, word: str) -> bool:# 若第 1 个字母为小写&#xff0c;则需额外判断第 2 个字母是否为小写if len(word) > 2 and word[0].islower() and word[1].isupper():return False# 无论第 1 个字…

【python ASR】win11-从0到1使用funasr实现本地离线音频转文本

文章目录 前言一、前提条件安装环境Python 安装安装依赖,使用工业预训练模型最后安装 - torch1. 安装前查看显卡支持的最高CUDA的版本&#xff0c;以便下载torch 对应的版本的安装包。torch 中的CUDA版本要低于显卡最高的CUDA版本。2. 前往网站下载[Pytorch](https://pytorch.o…

Java日志脱敏——基于logback MessageConverter实现

背景简介 日志脱敏 是常见的安全需求&#xff0c;最近公司也需要将这一块内容进行推进。看了一圈网上的案例&#xff0c;很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的&#xff0c;而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

Java面试经典 150 题.P26. 删除有序数组中的重复项(003)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) …

Prometheus套装部署到K8S+Dashboard部署详解

1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…

如何选择到印尼的海运代理

如何选择到印尼的海运代理 选择合适的海运代理的重要性 海运代理负责安排货物从发货地到目的地的整个运输过程&#xff0c;包括装运、清关、仓储等服务。一个可靠的海运代理能确保货物安全准时到达&#xff0c;并帮助企业节省时间和成本。 选择海运代理需考虑的主要因素 公司…

python常用的第三方库下载方法

方法一&#xff1a;打开pycharm-打开项目-点击左侧图标查看已下载的第三方库-没有下载搜索后点击install即可直接安装--安装成功后会显示在installed列表 方法二&#xff1a;打开dos窗口输入命令“pip install requests“后按回车键&#xff0c;看到successfully既安装成功&…

FFmpeg 4.3 音视频-多路H265监控录放C++开发八,使用SDLVSQT显示yuv文件 ,使用ffmpeg的AVFrame

一. AVFrame 核心回顾&#xff0c;uint8_t *data[AV_NUM_DATA_POINTERS] 和 int linesize[AV_NUM_DATA_POINTERS] AVFrame 存储的是解码后的数据&#xff0c;&#xff08;包括音频和视频&#xff09;例如&#xff1a;yuv数据&#xff0c;或者pcm数据&#xff0c;参考AVFrame结…

jenkins 构建报错 Cannot run program “sh”

原因 在 windows 操作系统 jenkins 自动化部署的时候, 由于自动化构建的命令是 shell 执行的,而默认windows 从 path 路径拿到的 shell 没有 sh.exe &#xff0c;因此报错。 解决方法 前提是已经安装过 git WINR 输入cmd 打开命令行, 然后输入where git 获取 git 的路径, …

基于Spring Boot的高校物品捐赠管理系统设计与实现,LW+源码+讲解

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校物品捐赠管理系统软件来发挥其高效地信息处理的作用&a…

AndroidStudio通过Bundle进行数据传递

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;AndroidStudio 目录 1.新建活动 2.修改页面布局 代码&#xff1a; 效果&#xff1a; 3.新建类ResultActivity并继承AppCompatActivity 4.新建布局文件activity_result.xml 代…