鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍
文章目录
- 一、访问控制
- 二、应用权限
- 1、应用权限管控
- 2、权限使用的基本原则
- 3、授权方式
- 4、权限等级
- 三、申请应用权限
- 1、选择申请权限的方式
- 2、声明权限
- 3、声明样例
- 4、二次向用户申请授权
- 5、具体实现示例
- 6、效果展示
- 四、应用权限列表
- 1、system_grant(系统授权)
- 2、user_grant(用户授权)
- 3、应用权限组列表
一、访问控制
默认情况下,应用只能访问有限的系统资源。但某些情况下,应用存在扩展功能的诉求,需要访问额外的系统数据(包括用户个人数据)和功能,系统也必须以明确的方式对外提供接口来共享其数据或功能。
系统通过访问控制的机制,来避免数据或功能被不当或恶意使用。当前访问控制的机制涉及多方面,包括应用沙箱、应用权限、系统控件等方案。
二、应用权限
系统根据应用的APL等级设置进程域和数据域标签,并通过访问控制机制限制应用可访问的数据范围,从而实现在机制上消减应用数据泄露的风险。
不同APL等级的应用能够申请的权限等级不同,且不同的系统资源(如:通讯录等)或系统能力(如:访问摄像头、麦克风等)受不同的应用权限保护。通过严格的分层权限保护,有效抵御恶意攻击,确保系统安全可靠。
1、应用权限管控
系统提供了一种允许应用访问系统资源(如:通讯录等)和系统能力(如:访问摄像头、麦克风等)的通用权限访问方式,来保护系统数据(包括用户个人数据)或功能,避免它们被不当或恶意使用。
应用权限保护的对象可以分为数据和功能:
数据包括个人数据(如照片、通讯录、日历、位置等)、设备数据(如设备标识、相机、麦克风等)。
功能包括设备功能(如访问摄像头/麦克风、打电话、联网等)、应用功能(如弹出悬浮窗、创建快捷方式等)。
2、权限使用的基本原则
合理的使用场景有助于应用权限申请和使用。开发应用时权限申请需要满足如下原则:
-
应用(包括应用引用的三方库)所需权限必须在应用的配置文件中严格按照权限开发指导逐个声明。
-
权限申请满足最小化原则,禁止申请非必要的、已废弃的权限。应用申请过多权限,会引起用户对应用安全性的担忧以及使用体验变差,从而也会影响到应用的安装率和留存率。
-
应用申请敏感权限时,必须填写权限使用理由字段,敏感权限通常是指与用户隐私密切相关的权限,包括地理位置、相机、麦克风、日历、健身运动、身体传感器、音乐、文件、图片视频等权限。
-
应用敏感权限须在对应业务功能执行前动态申请,满足隐私最小化要求。
-
用户拒绝授予某个权限后,应用与此权限无关的其他业务功能应允许正常使用。
3、授权方式
根据授权方式的不同,权限类型可分为system_grant(系统授权)和user_grant(用户授权)。
- system_grant(系统授权)
system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。
如果在应用中申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。
- user_grant(用户授权)
user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。
该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。
4、权限等级
为了防止应用过度索取和滥用权限,系统基于APL(Ability Privilege Level,元能力权限等级)等级,配置了不同的权限开放范围。
元能力权限等级APL指的是应用的权限申请优先级的定义,不同APL等级的应用能够申请的权限等级不同。
级别 | 说明 | 开放范围 |
---|---|---|
normal | 允许应用访问超出默认规则外的普通系统资源,如配置Wi-Fi信息、调用相机拍摄等。这些系统资源的开放(包括数据和功能)对用户隐私以及其他应用带来的风险低。 | 都能用 |
system_basic | 允许应用访问操作系统基础服务(系统提供或者预置的基础功能)相关的资源,如系统设置、身份认证等。这些系统资源的开放对用户隐私以及其他应用带来的风险较高。 | 要签名证书 |
system_core | 涉及开放操作系统核心资源的访问操作。这部分系统资源是系统最核心的底层服务,如果遭受破坏,操作系统将无法正常运行。 | 不开放 |
三、申请应用权限
1、选择申请权限的方式
应用在访问数据或者执行操作时,需要评估该行为是否需要应用具备相关的权限。如果确认需要目标权限,则需要在应用安装包中申请目标权限。
每一个权限的权限等级、授权方式不同,申请权限的方式也不同,开发者在申请权限前,需要先根据以下流程判断应用能否申请目标权限。
- system_grant(系统授权)
如果目标权限是system_grant类型,开发者在进行权限申请后,系统会在安装应用时自动为其进行权限预授予,开发者不需要做其他操作即可使用权限。
- user_grant(用户授权)
在应用需要获取user_grant权限时,请完成以下步骤:
1、在配置文件中,声明应用需要请求的权限。
2、将应用中需要申请权限的目标对象与对应目标权限进行关联,让用户明确地知道,哪些操作需要用户向应用授予指定的权限。
3、运行应用时,在用户触发访问操作目标对象时应该调用接口,精准触发动态授权弹框。该接口的内部会检查当前用户是否已经授权应用所需的权限,如果当前用户尚未授予应用所需的权限,该接口会拉起动态授权弹框,向用户请求授权。
4、检查用户的授权结果,确认用户已授权才可以进行下一步操作。
2、声明权限
应用在申请权限时,需要在项目的配置文件中,逐个声明需要的权限,否则应用将无法获取授权。
应用需要在module.json5配置文件的requestPermissions标签中声明权限。
属性 | 含义 | 数据类型 | 是否必填 | 取值范围 |
---|---|---|---|---|
name | 需要使用的权限名称。 | 字符串 | 必填 | 需为系统已定义的权限,取值范围请参考应用权限列表。 |
reason | 申请权限的原因。 | 字符串 | 选填 | 该字段用于应用上架校验,当申请的权限为user_grant权限时必填,并且需要进行多语种适配。使用string类资源引用。格式为$string: ***。 |
usedScene | 权限使用的场景。包括abilities和when两个子项。 -abilities:使用权限的UIAbility或者ExtensionAbility组件的名称。 - when:调用时机。 | 对象 | 必填 | 当申请的权限为user_grant权限时建议填写。 |
3、声明样例
// module.json5
{"module" : {"requestPermissions":[// 网络请求{"name": "ohos.permission.INTERNET"},// 相机{"name": "ohos.permission.CAMERA","reason": '$string:permission_reason_camera',"usedScene": {}},]}
}
4、二次向用户申请授权
当应用通过requestPermissionsFromUser()拉起弹框请求用户授权时,用户拒绝授权。应用将无法再次通过requestPermissionsFromUser拉起弹框,需要用户在系统应用“设置”的界面中,手动授予权限。
在“设置”应用中的路径:
路径一:设置 > 隐私和安全 > 权限类型(如麦克风) > 具体应用
路径二:设置 > 应用和元服务 > 某个应用
应用也可以通过调用requestPermissionOnSetting(),直接拉起权限设置弹框,引导用户授予权限。
5、具体实现示例
以申请使用麦克风权限为例进行说明。
在UI中向用户申请授权。
调用requestPermissionsFromUser()方法后,应用程序将等待用户授权的结果。如果用户授权,则可以继续访问目标操作。如果用户拒绝授权,则需要提示用户必须授权才能访问当前页面的功能,并引导用户到系统应用“设置”中打开相应的权限。
应用也可以通过调用requestPermissionOnSetting(),直接拉起权限设置弹框,引导用户授予权限。
import { abilityAccessCtrl, common, Permissions, bundleManager } from '@kit.AbilityKit'
import { promptAction } from '@kit.ArkUI';const context = getContext(this) as common.UIAbilityContext;@Entry
@Component
struct PermissionPage {// 打开系统设置的权限管理页openPermissionSettingsPage() {const BundleFlag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION// 获取 bundle 包信息const bundleInfo = bundleManager.getBundleInfoForSelfSync(BundleFlag)// 通过 startAbility 打开 系统设置 页context.startAbility({bundleName: 'com.huawei.hmos.settings', // 固定写法CV:设置页的包名abilityName: 'com.huawei.hmos.settings.MainAbility', // 固定写法CV:设置页的 ability 名uri: 'application_info_entry', // 固定写法CV:打开 设置->应用和元服务parameters: {// 应用包名可通过 bundleManager 动态获取pushParams: bundleInfo.name}})}// 申请麦克风授权async requestMicrophone() {const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE'];// 1. 创建应用权限管理器const atManager = abilityAccessCtrl.createAtManager()// 2. 向用户申请 user_grant 权限(温馨提示:首次申请时会弹窗,后续申请则不会再出现弹窗)const requestResult = await atManager.requestPermissionsFromUser(context, // 应用上下文permissions // 参数:权限列表(数组)zou)const isAuth = requestResult.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)// 如果点击拒绝,则弹窗引导去设置页开启if (!isAuth) {promptAction.showDialog({alignment: DialogAlignment.Center,title: '温馨提示',message: "开启后才能录制加密视频和音频",buttons: [{ text: '取消', color: '#89939c' },{ text: '去设置', color: '#0a59f7' },]}).then((res) => {// 用户点击了去设置if (res.index === 1) {// 通过代码打开当前应用的设置页this.openPermissionSettingsPage()}})}}build() {Column() {Button('申请麦克风授权').onClick(() => {this.requestMicrophone()})}.padding(20).height('100%').width('100%')}
}
6、效果展示
如果用户拒绝授权,通过调用requestPermissionOnSetting(),直接拉起权限设置弹框,引导用户授予权限。
四、应用权限列表
1、system_grant(系统授权)
更多请参见官网《对所有应用开放》
ohos.permission.USE_BLUETOOTH
允许应用查看蓝牙的配置。
ohos.permission.GET_BUNDLE_INFO
允许查询应用的基本信息。
ohos.permission.PREPARE_APP_TERMINATE
允许应用关闭前执行自定义的预关闭动作。
ohos.permission.PRINT
允许应用获取打印框架的能力。
ohos.permission.DISCOVER_BLUETOOTH
允许应用配置本地蓝牙,查找远端设备且与之配对连接。
ohos.permission.ACCELEROMETER
允许应用读取加速度传感器的数据。
ohos.permission.ACCESS_BIOMETRIC
允许应用使用生物特征识别能力进行身份认证。
ohos.permission.ACCESS_NOTIFICATION_POLICY
在本设备上允许应用访问通知策略。
仅当控制铃声从静音到非静音时,需要申请该权限。
ohos.permission.GET_NETWORK_INFO
允许应用获取数据网络信息。
ohos.permission.GET_WIFI_INFO
允许应用获取Wi-Fi信息。
ohos.permission.GYROSCOPE
允许应用读取陀螺仪传感器的数据。
ohos.permission.INTERNET
允许使用Internet网络。
ohos.permission.KEEP_BACKGROUND_RUNNING
允许Service Ability在后台持续运行。
ohos.permission.NFC_CARD_EMULATION
允许应用实现卡模拟功能。
ohos.permission.NFC_TAG
允许应用读写Tag卡片。
ohos.permission.PRIVACY_WINDOW
允许应用将窗口设置为隐私窗口,禁止截屏录屏
ohos.permission.PUBLISH_AGENT_REMINDER
允许该应用使用后台代理提醒。
ohos.permission.SET_WIFI_INFO
允许应用配置Wi-Fi设备。
ohos.permission.VIBRATE
允许应用控制马达振动。
ohos.permission.CAMERA
允许应用使用相机。
更多请参见官网《对所有应用开放》
2、user_grant(用户授权)
更多请参见官网《受限开放权限》
ohos.permission.READ_AUDIO
允许读取用户公共目录的音频文件。
ohos.permission.WRITE_AUDIO
允许修改用户公共目录的音频文件。
ohos.permission.READ_IMAGEVIDEO
允许读取用户公共目录的图片或视频文件。
ohos.permission.WRITE_IMAGEVIDEO
允许修改用户公共目录的图片或视频文件。
ohos.permission.SHORT_TERM_WRITE_IMAGEVIDEO
允许应用保存图片、视频到用户公共目录。应用获取此权限后,最长可获得30分钟的短时授权,来保存图片/视频。
ohos.permission.READ_CONTACTS
允许应用读取联系人数据。
ohos.permission.WRITE_CONTACTS
允许应用添加、移除或更改联系人数据。
ohos.permission.SYSTEM_FLOAT_WINDOW
允许应用使用全局悬浮窗的能力。
ohos.permission.READ_PASTEBOARD
允许应用读取剪贴板。
更多请参见官网《受限开放权限》
3、应用权限组列表
-
在申请目标权限前,建议开发者先阅读应用权限管控概述-权限组和子权限,了解相关概念,再合理申请对应的权限组。
-
当应用请求权限时,同一个权限组的权限将会在一个弹窗内一起请求用户授权,用户同意授权后,权限组内权限将被统一授权。地理位置、通讯录、通话记录、电话、信息、日历权限组除外。
-
当前系统支持的权限组如下所示,各子权限的含义请查阅应用权限列表。
更多请参见官网《应用权限组列表》
位置
ohos.permission.LOCATION_IN_BACKGROUND
ohos.permission.LOCATION
ohos.permission.APPROXIMATELY_LOCATION
相机
ohos.permission.CAMERA
麦克风
ohos.permission.MICROPHONE
通讯录
ohos.permission.READ_CONTACTS
ohos.permission.WRITE_CONTACTS
日历
ohos.permission.READ_CALENDAR
ohos.permission.WRITE_CALENDAR
图片和视频
ohos.permission.WRITE_IMAGEVIDEO
ohos.permission.READ_IMAGEVIDEO
ohos.permission.MEDIA_LOCATION
音乐和音频
ohos.permission.WRITE_AUDIO
ohos.permission.READ_AUDIO
文件夹
ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY
ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY
更多请参见官网《应用权限组列表》
相关文章:

鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍
文章目录 一、访问控制二、应用权限1、应用权限管控2、权限使用的基本原则3、授权方式4、权限等级 三、申请应用权限1、选择申请权限的方式2、声明权限3、声明样例4、二次向用户申请授权5、具体实现示例6、效果展示 四、应用权限列表1、system_grant(系统授权&#…...

mac 桌面版docker no space left on device
报错信息 docker pull镜像时报: failed to register layer: Error processing tar file(exit status 1): write /home/admin/oceanbase_bak/bin/observer: no space left on device 解决 增加 docker 虚拟磁盘大小。 调整完点击重启即可。...
基于CIM的街镇基层治理统一指挥平台建设方案
1 项目概述 1.1 建设背景 社区作为人民生活的重要区域,往往需要对社区内人员、房屋、基本设施、日常业务进行规范管理,以保证其正常运行,但是传统的社区治理方式已不能满足新时代社会发展的要求,如人工采集录入信息、人员现场巡逻等,这些工作方式不仅工作量大,而且效率…...

PostgreSQL学习笔记三:数据类型和运算符
数据类型和运算符 PostgreSQL 支持多种数据类型和运算符,以下是一些常见的数据类型和运算符的概述: 数据类型 基本数据类型 整数类型: SMALLINT:2 字节,范围 -32,768 到 32,767。INTEGER:4 字节࿰…...

ROS理论与实践学习笔记——6 ROS机器人导航(仿真)
在 ROS 中,机器人导航(Navigation)是由多个功能包组合而成的系统,统称为导航功能包集(navigation stack)。它提供了一个全面的框架,使得移动机器人能够自主导航到指定目标点,同时避开…...
uniapp开发微信小程序,button的open-type=“share“ 分享给个人跳转到首页问题
当使用button标签带上open-type"share"属性,点击之后可分享当前页面给微信好友,但是分享之后朋友点开跳转到了首页问题。 需要使用 onShareAppMessage 函数 export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分…...

【jQuery】 jQuery基础及选择器介绍(基本选择器 层次选择器 属性选择器 过滤选择器)
文章目录 jQuery基础1. 优势2. 版本3. 基本语法4. 选择器基本选择器层次选择器属性选择器过滤选择器基本过滤选择器可见性过滤选择器 注意事项 jQuery基础 jQuery 是一个功能强大且易于使用的 JavaScript 库,它极大地简化了前端开发的工作。无论是 DOM 操作、事件处…...

网站在对抗机器人攻击的斗争中失败了
95% 的高级机器人攻击都未被发现,这一发现表明当前的检测和缓解策略存在缺陷。 这表明,虽然一些组织可能拥有基本的防御能力,但他们没有足够的能力应对更复杂的攻击。 例如利用人工智能和机器学习来模仿人类行为的攻击。 这些统计数据强调…...
Centos7 搭建logstash
下载并安装公共签名密钥: sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 创建一个名为 /etc/yum.repos.d/logstash.repo 的文件,并添加以下内容: [logstash-7.x] nameElastic repository for 7.x packages baseu…...

面试题:Redis(五)
1. 面试题 面试问 记录对集合中的数据进行统计 在移动应用中,需要统计每天的新增用户数和第2天的留存用户数; 在电商网站的商品评论中,需要统计评论列表中的最新评论; 在签到打卡中,需要统计一个月内连续打卡的用户数&…...

LeetCode18.四数之和
题目链接:18. 四数之和 - 力扣(LeetCode) 这道题是在三数之和上改编出来的,在写这道题之前可以尝试以下三数之和(15. 三数之和 - 力扣(LeetCode)); 1.常规解法…...

jmeter出参保存到文件,保存失败解决
1、添加JSON提取 2、添加beanshell FileWriter writer new FileWriter("C:/Users/xxx/Desktop/signUrl.csv", true); writer.write(vars.get("company_name")"\t"vars.get("signUrl")"\n"); writer.close(); 写文件的两个…...
黑龙江网络安全等级保护办理机制
黑龙江的网络安全等级保护机制根据《网络安全法》和相关法规要求,信息系统按照安全等级从低到高分为五级,分别为一般、重要、非常重要、特别重要和特别敏感。不同等级的信息系统必须实施相应的安全措施,以确保系统免受内外部威胁,…...
小红的行列式构造
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 小红希望你构造一个3阶行列式,满足每个元素的绝对值不小于1,且行列式的值等于xxx。你能帮帮她吗? 输入描述: 一个整数xxx −100≤x≤100 输出描…...
pyflink过滤kafka数据
from pyflink.table import (TableEnvironment, EnvironmentSettings)# 输入、输出、过滤条件 columns_in [ ... ]columns_out [ ... ] filter_condition "name 蒋介石 and sex 男"# 创建执行环境t_env TableEnvironment.create(EnvironmentSettings.in_stream…...

Webpack 完整指南
🌈个人主页:前端青山 🔥系列专栏:Webpack篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack介绍 目录 介绍 一、webpack 1.1、webpack是什么 1.2 webpack五个核心配置 1.…...
如何在 Ubuntu20.04 安装FTP Server vsftpd
1.安装: sudo apt-get install vsftpd 2.启动 sudo service vsftpd start //启动 sudo service vsftpd stop //停止 sudo service vsftpd restart //重新启动 3.打开配置文件 sudo nano /etc/vsftpd.conf 4.配置:限制在指定目录&…...

基于FPGA的DDS信号发生器(图文并茂+深度原理解析)
篇幅有限,本文详细源文件已打包 至个人主页资源,需要自取...... 前言 DDS(直接数字合成)技术是先进的频率合成手段,在数字信号处理与硬件实现领域作用关键。它因低成本、低功耗、高分辨率以及快速转换时间等优点备受认可。 本文着重探究基于 FPGA 的简易 DDS 信号发生器设…...

QT:绘制事件和定时器
1.绘制时针 xx.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include<QPainter> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpubl…...
【算法——递归回溯】
这个东西还是很重要的,直接决定了你的动态规划章节的学习深度 78. 子集 方法1: vector<vector<int>>V; void dfs(vector<int> v,vector<int> nums,int index) {if(indexnums.size()) V.push_back(v);else{v.push_back(nums[i…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...